首页 > 解决方案 > 并行运行任务,收到一定结果后取消线程

问题描述

我想让 3 个线程并行运行并并行返回结果,这样当一个任务在生成正确的数字时返回 true 时,所有其他线程都停止执行。

我尝试使用CallableFutureCallablenewFixedThreadPool,但我似乎得到了想要的结果。每次的问题是我必须等待所有结果完成,但如果一个线程找到了我正在寻找的随机数,我只想停止所有线程。

下面是伪代码:

    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));
        }

有谁知道如何实现这一目标?

在您将其标记为重复之前,请花一些时间考虑这是否真的是因为我还没有看到描述这个完全相同的问题的其他问题。

标签: javamultithreadingcallable

解决方案


@mihael Keehl,我认为您需要使用的是“CountDownLatch”,它将充当一个门,以确保配置的线程数(可使用其构造函数初始化)将在控制传递到下一行代码之前完成它们的执行主线程。释放闩锁后,您将能够检查线程的状态并中断仍在运行的线程。如果您需要特定的代码示例,请告诉我 - 我可以提供帮助。


推荐阅读