прием HTTPS-соединений с самозаверяющими сертификатами

Это вызвано возможностью в JVM и, если вы не делаете взломать, например, тот, который предоставлен Marcus A., на самом деле не так просто работать. .flush() работает в этом случае, но причина этого намного сложнее в работе.

Что здесь происходит?

Когда вы программируете на Java, вы не говоря компьютеру, что делать, вы сообщаете JVM (виртуальная машина Java), что вы хотели бы сделать. И он будет делать это, но более эффективно. Ваш код не является точным подробным инструкциям, в этом случае вам нужен только компилятор, как на C и C ++, JVM берет ваш код в качестве списка спецификаций для того, что он должен оптимизировать, а затем делать. Это то, что происходит здесь. Java видит, что вы нажимаете строки в два разных потока буферов. Самый эффективный способ сделать это - буферизировать все строки, которые вы хотите передать потокам, а затем вывести их. Это происходит по одному потоку в то время, существенно преобразуя ваш код, сделав что-то вроде этого (остерегайтесь: псевдокод) :

for(int i = 0; i < 5; i++) {
    out.add();
    err.add();
}
out.flush();
err.flush();

Поскольку это более эффективно, Вместо этого будет работать JVM. Добавление .flush() в цикле будет сигнализировать JVM о необходимости промывки в каждом цикле, который не может быть улучшен с помощью вышеуказанного метода. Но если вы объясните, как это будет работать, цикл JVM изменит порядок вашего кода, чтобы сделать его последним, потому что это более эффективно.

System.out.println("out");
System.out.flush();
System.err.println("err");
System.err.flush();
System.out.println("out");
System.out.flush();
System.err.println("err");
System.err.flush();

Этот код будет всегда реорганизуются на что-то вроде этого:

System.out.println("out");*
System.err.println("err");*
System.out.println("out");*
System.err.println("err");*
System.out.flush();
System.err.flush();

Поскольку буферизация многих буферов только для их очистки сразу после того, как требуется намного больше времени, чем для буферизации всего кода, который будет буферизироваться, а затем очистить все это в то же время.

Как это решить

В этом случае код и дизайн кода могут вступить в игру; вы вроде бы не решаете этого. Чтобы обойти это, вы должны сделать его более эффективным для буферизации печати / флеша, печати буфера или флеша, чем буфер, а затем сброс. Это, скорее всего, соблазнит вас неудачным дизайном. Если для вас важно, как вывести его упорядоченно, я предлагаю вам попробовать другой подход. For-looping с .flush() - это один из способов взломать его, но вы все еще взламываете функцию JVM, чтобы перенастроить и оптимизировать свой код для вас.

* Я не могу проверить, что буфер, который вы добавили сначала, всегда будет печатать первым, но, скорее всего, будет.

148
задан ivanleoncz 20 February 2018 в 19:03
поделиться