【发布时间】:2013-09-06 16:22:33
【问题描述】:
在 Clojure 中并发调用 println 时,我发现它的行为与 Java 的 System.out.println 不同。
我会用 Java 写什么
class Pcalls {
public static void main(String[] args) {
Runnable[] fns = new Runnable[3];
for (int i = 0; i < 3; i++) {
fns[i] = new Runnable() {
@Override public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("Hello iteration " + i);
}
}
};
}
for (Runnable fn : fns) new Thread(fn).start();
}
}
我在 Clojure 中解释为:
(doall (apply pcalls
(repeat 3 #(dotimes [i 5] (println "Hello iteration" (inc i))))))
不幸的是,在 Clojure 版本中,输出行经常出现交错:
Hello iterationHello iteration 1
Hello iteration Hello iteration 2
Hello iteration 3
1
Hello iteration 4
1
Hello iteration Hello iteration5
Hello iteration 2
Hello iteration 23
Hello iteration Hello iteration 4
3Hello iteration
5
Hello iteration 4
Hello iteration 5
(nil nil nil)
在 Java 中这个never happens,每条消息都打印在自己的行上。
您能否解释一下 Clojure 的 println 与 Java 的不同之处和原因,以及如何在 Clojure 中实现与 println 类似的“线程安全”行为?
【问题讨论】:
标签: multithreading concurrency clojure