我有一个包含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});
}
我在做什么错了?
答案 0 :(得分:1)
时髦...
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
都不同
答案 1 :(得分:0)
这是因为4
1 2
2 3
5 6
1 5
比main thread
更差。
要强制ExecutorService
等待Main thread
完成处理,请使用以下方法:
ExecutorService
答案 2 :(得分:-1)
每个元素的执行时间不相同。因此,在过程结束时,需要关闭线程。您可以使用
if ( check_whether_operation_is_done ) {
Logger.info( "Process shutdown" );
exeSvc.shutdownNow();
}