java - 使用 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});
}
我究竟做错了什么?
解决方案
时髦的...
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
不同
推荐阅读
- matrix - 在 Sage 中解决矩阵中的缺失值
- node.js - 使用 node-postgres 查询的 Promise 总是返回 undefined
- c++ - 编译器是否允许围绕 `std::condition_variable::notify_one` 重新排序语句?
- javascript - if条件中的javascript井字游戏逻辑错误
- python - 在 Python 中使用 ctypes.CDLL 调用 ac 函数时,函数总是将 0 作为参数传递
- django - 我可以将搜索框添加到 Django 管理员添加页面吗?
- python - 无法在我的 Django 项目中安装简单 JWT
- c++builder - 如何在 C++ Builder 中为浮点数设置 DecimalSeparator
- python - Pandas groupby 根据条件创建新列
- java - Android 应用无法连接到 Socket.io 服务器