首页 > 解决方案 > 使用 Threadpool 和 executor 服务进行处理

问题描述

我有一个 10 个元素的 ArrayList。我启动了一个大小为 10 的线程池,并使用传递给每个线程的元素调用执行。每个线程将该元素作为输入进行一些处理并输出结果。问题是,有时输出的处理结果有时只有 7 个元素,有时有 8 个元素,有时有一些重复,有时有 9 个元素。我不确定为什么我没有正好 10 个元素的处理结果。这是我的代码片段。

ExecutorService exeSvc = 
                Executors.newFixedThreadPool(10)
for (Object element: arlList)//arlList is the arraylist of 
                                                           size-10
{
   exeSvc.execute({->myRunnable element});
}

我究竟做错了什么?

标签: javamultithreadinggroovythreadpoolthreadpoolexecutor

解决方案


时髦的...

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


推荐阅读