简单地说,我试图看到使用sychronized关键字而不仅仅是在没有锁的线程上运行函数时的区别。
在此代码中:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;
public class mainClass {
static int count=0;
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
Runnable r =new Runnable() {
public synchronized void run() {
count = count + 1;
}
};
IntStream.range(0, 10000)
.forEach(i -> executor.submit(r::run));
executor.shutdown();
System.out.println(count); // 10000
}
}
它不起作用,因为我预测它起作用,它在40%的运行中返回10000。这是为什么?问题出在哪儿? 我认为函数运行一次只运行一个线程,所以应该没有问题,但显然我错了。
答案 0 :(得分:4)
ExecutorService#shutdown
不等待任务完成。您应该使用awaitTermination
。
请参阅documentation for ExecutorService#shutdown。
IntStream.range(0, 10000)
.forEach(i -> executor.submit(r::run));
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTE); // <!-- HERE