我使用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();
}
编辑:我完全改变了我的逻辑。我没有做太多测试,但现在一切都好了。也许这在我的旧逻辑中是错误的。
答案 0 :(得分:1)
执行程序不会销毁忙于执行任务的线程。如果您分配了60个任务,并且只有55个“完成”(更准确地说,您的setTaskFinish()
方法仅被调用了55次),则可能会过早地终止您的任务。死锁是另一种可能性,但不是我要检查的第一种。
当您的任务抛出未经检查的异常RuntimeException
时会发生什么?它会从setTaskFinish()
块调用finally
吗?为什么使用synchronized
而不是AtomicInteger
来管理并发?