clojure - 子线程中的 printf 不输出任何内容
问题描述
clojure 1.10.1
println至少在子线程中输出,但printf根本不输出。
(.start (Thread. #(println "Hi !"))) ; => Hi
(.start (Thread. #(printf "%s\n" "Hi")))
这个问题似乎与println同步有关。关于printf的任何建议?
@编辑
上面,clj REPL上的println和printf输出。println输出,但printf不是独立程序。
解决方案
对于独立程序,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();
推荐阅读
- angular - Google Cloud Run - Docker 构建容器构建但无法访问
- node.js - 使用 id 从 mongodb 获取数据到 angular 的问题
- r - 将图例添加到 Plotly Graph R
- java - 如何使用 MySQL 连接器添加回调方法?
- c# - 手动进行流利验证时如何获得相同的响应模式
- groovy - Groovy 可迭代组件移除最高版本
- serialization - marshmallow - 如果 foreign_key 不是 int,则 include_fk 失败
- php - 创建 docker 映像的作业失败
- intellij-idea - IntelliJ IDEA 社区中的 Java 断言?
- ios - 来电被呼叫目录扩展阻止时调用什么方法