首页 > 解决方案 > 子线程中的 printf 不输出任何内容

问题描述

clojure 1.10.1

println至少在子线程中输出,但printf根本不输出。

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

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

这个问题似乎与println同步有关。关于printf的任何建议?

@编辑

上面,clj REPL上的printlnprintf输出。println输出,但printf不是独立程序。

标签: clojure

解决方案


对于独立程序,println打印到标准输出,这是一个 PrintWriter,它在打印后刷新内部缓冲区。来自PrintStream 的 JavaDoc

[...] 可选地,可以创建一个 PrintStream 以便自动刷新;这意味着在写入字节数组、调用 println 方法之一或写入换行符或字节 ('\n') 后会自动调用 flush 方法。

printf不进行刷新,因此(除非它由 REPL 完成)在程序结束之前没有强制功能对其进行打印。如果你想手动刷新它,你可以(.flush System/out)自己做(println)

编辑:您可以在 JDK 的源代码中看到它:println()调用一个名为newLine()的私有方法来执行刷新:

// ... snip
            synchronized (this) {
                ensureOpen();
                textOut.newLine();
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush)
                    out.flush();

推荐阅读