gpt4 book ai didi

java - cachedThreadPool 没有按我的预期工作

转载 作者:行者123 更新时间:2023-12-01 23:53:00 32 4
gpt4 key购买 nike

我正在玩线程,但我不明白为什么这没有像我想象的那样工作。

我正在尝试使用线程计算总和,并期望线程池在打印结果时等待所有任务完成(由于 shutdown() 调用和 isTermination() 检查)。

我在这里缺少什么?

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test5 {

private Integer sum= new Integer(0);

public static void main(String[] args) {

ExecutorService pool = Executors.newCachedThreadPool();
Test5 obj = new Test5();

for(int i=0; i<1000; i++){
pool.execute(obj.new Adding());
}

pool.shutdown();

while(!pool.isTerminated()) {
//could be empty loop...
System.out.println(" Is it done? : " + pool.isTerminated());
}

System.out.println(" Is it done? : " + pool.isTerminated());
System.out.println("Sum is " + obj.sum);
}

class Adding implements Runnable {

public void run() {

synchronized(this) {

int tmp = sum;
tmp+=1;
sum=new Integer(tmp);
}
}
}
}

虽然我确实得到了很好的结果,但我也得到了如下输出:

Is it done? : true
Sum is 983

最佳答案

您需要在主对象实例上同步。我在下面使用 int,Integer 也可以工作(需要显式初始化为零)。

这是工作代码

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AppThreadsSum {

int sum;

public static void main(String[] args) {

ExecutorService pool = Executors.newCachedThreadPool();

AppThreadsSum app = new AppThreadsSum();

for (int i = 0; i < 1000; i++) {
pool.execute(app.new Adding());
}

pool.shutdown();

while (!pool.isTerminated()) {
System.out.println(" Is it done? : " + pool.isTerminated());
}

System.out.println(" Is it done? : " + pool.isTerminated());
System.out.println("Sum is " + app.sum);
}

class Adding implements Runnable {

public void run() {

synchronized (AppThreadsSum.this) {

sum += 1;
}
}
}
}

附:忙碌等待是一种需要避免的反模式(从邻居的答案中复制来完整并了解这一重要的事情,请参阅评论)

关于java - cachedThreadPool 没有按我的预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16085199/

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