gpt4 book ai didi

java - 线程被破坏?

转载 作者:行者123 更新时间:2023-11-30 11:53:51 24 4
gpt4 key购买 nike

我使用 Executors.newFixedThreadPool 创建了一个线程池,但一段时间后我注意到其中一些线程停止了响应(在下面调用此方法)。

他们被摧毁了?我进行同步,当所有线程都设置为完成任务时系统继续运行,但是这样系统就进入了死锁状态。

他们被摧毁了?我可以做些什么来防止或处理这种情况?

//this is the method that threads call when finish the work
synchronized void setTaskFinish(){
System.out.println(Thread.currentThread().getName() + " finishing the work.");
finishedThreads++;
System.out.println(finishedThreads +" finished the work.");
if(finishedThreads == numberThreads){
finishedThreads = 0;
this.notify();
}
}

//this is the method that creates the thread
//I dont know much about this executors yet, so I think it have errors
public void execute(int numberThreads) {
for (int i = 0; i < numberThreads; i++) {
crawlers.add(new SlaveCrawler());
}

ExecutorService threadExecutor = Executors.newFixedThreadPool(numberThreads);

for (int i = 0, n = crawlers.size(); i < n; i++) {
threadExecutor.execute((Runnable) crawlers.get(i));
}

threadExecutor.shutdown();
}

编辑:我完全改变了我的逻辑。我没有做太多测试,但现在一切似乎都很好。也许我以前的逻辑有问题。

最佳答案

执行器不会销毁忙于执行您的任务的线程。如果您分配了 60 个任务,并且只有 55 个“完成”(更准确地说,您的 setTaskFinish() 方法只被调用了 55 次),它可能是异常提前终止您的任务。死锁是另一种可能性,但不是我要研究的第一种可能性。

当您的任务抛出一个未经检查的异常(如 RuntimeException)时会发生什么?它是否从 finally block 中调用 setTaskFinish()?为什么要使用 synchronized 而不是 AtomicInteger 来管理并发?

关于java - 线程被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050170/

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