gpt4 book ai didi

multithreading - 用与Java相同的方式制作Clojure的println "thread-safe"

转载 作者:行者123 更新时间:2023-12-03 13:14:18 25 4
gpt4 key购买 nike

在玩并发调用 println 时在 Clojure 中,我发现它的行为与 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 不同,以及如何使用 println 获得类似的“线程安全”行为在 Clojure 中?

最佳答案

clojure 中的一个约定是锁定 *out* ,它指的是打印到的位置。

user> (doall (apply pcalls
(repeat 3 #(dotimes [i 5]
(locking *out*
(println "Hello iteration" (inc i)))))))
Hello iteration 1
Hello iteration 1
Hello iteration 2
Hello iteration 3
Hello iteration 4
Hello iteration 5
Hello iteration 1
Hello iteration 2
Hello iteration 3
Hello iteration 4
Hello iteration 5
Hello iteration 2
Hello iteration 3
Hello iteration 4
Hello iteration 5
(nil nil nil)

关于multithreading - 用与Java相同的方式制作Clojure的println "thread-safe",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com