我有一个由10个元素组成的ArrayList。我启动一个大小为10的线程池,并使用传递到每个线程的元素调用execute。每个线程都以该元素作为输入进行一些处理,并输出结果。问题是,输出有时只有7个元素的处理结果,有时只有8个元素,有几个重复元素,有时有9个元素。我不知道为什么我没有准确的10个元素的处理结果。这是我的代码片段。
ExecutorService exeSvc =
Executors.newFixedThreadPool(10)
for (Object element: arlList)//arlList is the arraylist of
size-10
{
exeSvc.execute({->myRunnable element});
}我做错了什么?
发布于 2018-07-19 10:59:05
太棒了..。
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
ExecutorService exeSvc = Executors.newFixedThreadPool(5)
for (int element=0;element<9;element++) {
int elementCopy = element
exeSvc.execute({->
Thread.sleep(567);
println "${Thread.currentThread()} element = $element elementCopy = $elementCopy";
});
}
println "All Started"
exeSvc.shutdown()
exeSvc.awaitTermination(10, TimeUnit.SECONDS)
println "All Finished"输出
All Started
Thread[pool-12-thread-1,5,main] element = 9 elementCopy = 0
Thread[pool-12-thread-2,5,main] element = 9 elementCopy = 1
Thread[pool-12-thread-3,5,main] element = 9 elementCopy = 2
Thread[pool-12-thread-4,5,main] element = 9 elementCopy = 3
Thread[pool-12-thread-5,5,main] element = 9 elementCopy = 4
Thread[pool-12-thread-1,5,main] element = 9 elementCopy = 5
Thread[pool-12-thread-2,5,main] element = 9 elementCopy = 6
Thread[pool-12-thread-3,5,main] element = 9 elementCopy = 7
Thread[pool-12-thread-4,5,main] element = 9 elementCopy = 8
All Finished在我的例子中可以看到,for循环在线程启动之前就完成了,所有线程都有element值9,并且elementCopy是不同的。
发布于 2018-07-19 11:07:22
这是因为main thread的成绩比ExecutorService好。
若要强制Main thread等待ExecutorService完成处理,请使用以下命令:
exeSvc.awaitTermination(5, TimeUnit.SECONDS); //this will 5 second to finish all tasks
exeSvc.shutdown();发布于 2018-07-19 10:53:47
每个元素的执行时间并不相同。因此,在进程结束时,需要关闭线程。你可以用,
if ( check_whether_operation_is_done ) {
Logger.info( "Process shutdown" );
exeSvc.shutdownNow();
}https://stackoverflow.com/questions/51420424
复制相似问题