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

时间:2018-07-19 10:34:18

标签: java multithreading groovy threadpool threadpoolexecutor

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

我在做什么错了?

3 个答案:

答案 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();
}