使用线程池和执行程序服务进行处理

Processing with Threadpool and executor service

我有一个包含 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});
}

我做错了什么?

每个元素的执行时间不一样。因此,在进程结束时,需要关闭线程。你可以使用,

if ( check_whether_operation_is_done ) {
    Logger.info( "Process shutdown" );
    exeSvc.shutdownNow();
}

groovy...

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 不同

那是因为 main threadExecutorService 早完成。

要强制 Main thread 等待 ExecutorService 完成处理,请使用:

exeSvc.awaitTermination(5, TimeUnit.SECONDS); //this will 5 second to finish all tasks
exeSvc.shutdown();