Запускать задачи параллельно и отменять потоки после получения определенного результата - PullRequest
0 голосов
/ 08 июля 2020

Я хочу, чтобы 3 потока работали параллельно и возвращали результаты параллельно, чтобы, когда задача вернула истину, когда она сгенерировала правильное число, все другие потоки перестали выполняться.

Я пытался используя 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));
        }

Кто-нибудь знает, как этого добиться?

И прежде, чем вы отметите это как дубликат, пожалуйста, найдите время, чтобы подумать, так ли это на самом деле, потому что я не встречал других вопросов, описывающих ту же самую проблему.

1 Ответ

1 голос
/ 08 июля 2020

@ mihael Keehl, я думаю, что вам нужно использовать «CountDownLatch», который будет действовать как вентиль, чтобы убедиться, что настроенное количество потоков (инициализируемых с помощью его конструктора) завершит свое выполнение до того, как управление перейдет к следующей строке код в основном потоке. После того, как защелка будет отпущена, вы сможете проверить состояние потоков и прервать те, которые все еще работают. Пожалуйста, дайте мне знать, если вам нужны конкретные c примеры кода - я могу помочь.

...