首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用线程池和执行器服务进行处理

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

Stack Overflow用户
提问于 2018-07-19 10:34:18
回答 3查看 1.1K关注 0票数 0

我有一个由10个元素组成的ArrayList。我启动一个大小为10的线程池,并使用传递到每个线程的元素调用execute。每个线程都以该元素作为输入进行一些处理,并输出结果。问题是,输出有时只有7个元素的处理结果,有时只有8个元素,有几个重复元素,有时有9个元素。我不知道为什么我没有准确的10个元素的处理结果。这是我的代码片段。

代码语言:javascript
复制
ExecutorService exeSvc = 
                Executors.newFixedThreadPool(10)
for (Object element: arlList)//arlList is the arraylist of 
                                                           size-10
{
   exeSvc.execute({->myRunnable element});
}

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-19 10:59:05

太棒了..。

代码语言:javascript
复制
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"

输出

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-07-19 11:07:22

这是因为main thread的成绩比ExecutorService好。

若要强制Main thread等待ExecutorService完成处理,请使用以下命令:

代码语言:javascript
复制
exeSvc.awaitTermination(5, TimeUnit.SECONDS); //this will 5 second to finish all tasks
exeSvc.shutdown();
票数 0
EN

Stack Overflow用户

发布于 2018-07-19 10:53:47

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

代码语言:javascript
复制
if ( check_whether_operation_is_done ) {
    Logger.info( "Process shutdown" );
    exeSvc.shutdownNow();
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51420424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档