java - 并行运行任务,收到一定结果后取消线程
问题描述
我想让 3 个线程并行运行并并行返回结果,这样当一个任务在生成正确的数字时返回 true 时,所有其他线程都停止执行。
我尝试使用CallableFuture和Callable和newFixedThreadPool,但我似乎得到了想要的结果。每次的问题是我必须等待所有结果完成,但如果一个线程找到了我正在寻找的随机数,我只想停止所有线程。
下面是伪代码:
public class GenerateRandomIntegerTask implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
// From constructor
int rand1 = rand1;
int rand2 = rand2;
// Do the work here
Rand rand = new Random();
int rand3 = random.nextInt(100);
if(rand1 + rand2 + rand3 == 5)
{
// STOP ALL TRHREADS
return true;
}
else
{
return false;
}
}
}
我使用 newFixedThreadPool 执行此操作,如下所示:
MultiValuedMap<Integer, Integer> randMap = randHelper.retrieveRandMap();
Iterator it = randMap.entries().iterator();
ExecutorService executor = Executors.newFixedThreadPool(3);
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
int rand1 = pair.getKey().toString();
String rand2 = pair.getValue().toString();
executor.submit(new GenerateRandomIntegerTask (rand1, rand2));
}
有谁知道如何实现这一目标?
在您将其标记为重复之前,请花一些时间考虑这是否真的是因为我还没有看到描述这个完全相同的问题的其他问题。
解决方案
@mihael Keehl,我认为您需要使用的是“CountDownLatch”,它将充当一个门,以确保配置的线程数(可使用其构造函数初始化)将在控制传递到下一行代码之前完成它们的执行主线程。释放闩锁后,您将能够检查线程的状态并中断仍在运行的线程。如果您需要特定的代码示例,请告诉我 - 我可以提供帮助。
推荐阅读
- visual-studio-code - VS Code:多行键绑定
- linux - Powershell 在 VSCode Linux 上找不到类型 [Pester.OutputTypes]
- react-native - React Native 如何在错误时替换图像 url?
- python - Python shapely:将点聚合为 Choropleth 地图的形状文件
- python - Pandas 重采样代码运行速度极慢
- ruby - 在没有救援的情况下使用 ruby begin 的目的是什么?
- php - 使用 php 更改链接单击时回显内的目录名称或路径
- boost - boost b2 --layout=system 使用 CMake 在 Visual Studio 上导致 LNK1104 错误
- docker - 无法创建 docker 注册表代理缓存:权限被拒绝
- c# - 为什么是 services.AddDbContext
() 使 dbContext 成为 Scoped 服务?不应该是 Singleton 服务吗?