printf в подпотоке ничего не выводит - PullRequest
0 голосов
/ 27 апреля 2020

clojure 1.10.1

println по крайней мере выводит в подпотоке, но printf совсем не выводит.

(.start (Thread. #(println "Hi !"))) ; => Hi

(.start (Thread. #(printf "%s\n" "Hi"))) 

Этот вопрос , по-видимому, имел дело с println синхронизацией. Любой совет по printf ?

@ EDIT

Выше, оба println и printf output на clj REPL. println выводит, но printf не является отдельной программой.

1 Ответ

0 голосов
/ 01 мая 2020

Для автономной программы println печатает на стандартный вывод, который является PrintWriter, который очищает внутренний буфер после печати. Из JavaDo c для PrintStream :

[...] По желанию, PrintStream может быть создан так, чтобы грипп sh автоматически; это означает, что метод flu sh автоматически вызывается после записи байтового массива, запускается один из методов println или пишется символ новой строки или байт ('\ n').

printf не выполняет очистку, поэтому (если это не выполнено REPL) нет функции принудительного вывода на печать до завершения программы. Если вы хотите грипп sh вручную, вы всегда можете сделать (.flush System/out) или (println) самостоятельно.

Редактировать : вы можете увидеть это в источниках JDK: println () вызывает закрытый метод с именем newLine () , который выполняет сброс:

// ... snip
            synchronized (this) {
                ensureOpen();
                textOut.newLine();
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush)
                    out.flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...