Остановите других работников всякий раз, когда работник возвращает ложное значение

1

Я представляю многих рабочих, работающих на нескольких потоках. Мы останавливаем или не отправляем других работников, если какой-либо работающий работник возвращает ложное значение. Ниже приведен пример моего образца. Что мне делать в части TODO? Пожалуйста, дайте мне несколько советов в этом вопросе.

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;

public class CompletionServiceTest
{
    public static void main(final String[] args)
    {
        ExecutorService cs = Executors.newFixedThreadPool(1);
        Collection<Worker> tasks = new ArrayList<Worker>(10);

        for(int i=0;i<10;i++) {
            tasks.add(new Worker(i+1));
        }

        List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>(tasks.size());
        try
        {
            for (Callable task : tasks)
            {
                futures.add(cs.submit(task));
            }

        // TODO
       // Check if any false value is returned
      // Then stop all running tasks, no need to run other tasks anymore
       }           
        finally
        {
            //Cancel by interrupting any existing tasks currently running in Executor Service
            for (Future<Boolean> f : futures)
            {
                f.cancel(true);
            }
        }
        System.out.println(new Date()+":Done");
    }
}

class Worker implements Callable<Boolean>
{
    private int number;
    public Worker(int number)
    {
        this.number=number;
    }

    public Boolean call()
        throws InterruptedException
    {
        try
        {            
            Thread.sleep(50000);
            if(number % 4 == 0) {
                return false;
            } else {
                Thread.sleep(500000);
            }
        }
        catch(InterruptedException ie)
        {
            System.out.println("Worker Interuppted");
            throw ie;
        }

        return true;
    }
}
  • 2
    Вы изучили пример в javadoc ExecutorCompletionService ? Это в значительной степени именно то, что вам нужно.
  • 0
    Я попробую это. Спасибо за помощь, Марко :) :)
Теги:
multithreading

1 ответ

0

Я играл вокруг этого решения, если вы все еще ищете рабочий пример:

class CompletionServiceTest {

    public static void main(String... args) throws Exception {
        ExecutorService es = newFixedThreadPool(10);
        CompletionService<Boolean> cs = new ExecutorCompletionService<Boolean>(es);
        for (int i = 1; i <= 10; i++) cs.submit(new Worker(i));
        int count = 0;
        while (++count <= 10 && cs.take().get());
        es.shutdownNow();
    }
}

class Worker implements Callable<Boolean> {

    private final int number;

    public Worker(int number) {
        this.number = number;
    }

    @Override public Boolean call() throws Exception {
        try {
            Thread.sleep(1000 + number * 100);
            if (number % 4 == 0) {
                System.out.printf("worker [%d] failed.\n", number);
                return false;
            }
            System.out.printf("worker [%d] done!\n", number);
            return true;
        } catch (InterruptedException ie) {
            System.out.printf("Worker [%d] stopped!\n", number);
            throw ie;
        }
    }
}

Результат выглядит следующим образом:

worker [1] done!
worker [2] done!
worker [3] done!
worker [4] failed.
Worker [9] stopped!
Worker [7] stopped!
Worker [8] stopped!
Worker [5] stopped!
Worker [6] stopped!
Worker [10] stopped!
  • 0
    не думайте, что это сработает, так как future.get() будет ждать завершения первого работника, что не так
  • 0
    ОП может не захотеть немедленно завершать работу Службы Исполнителя. Как правило, это синглтон всего приложения и удовлетворяет все потребности для одновременного выполнения. Вот почему более подробный вариант, который явно отменяет все оставшиеся фьючерсы, является предпочтительным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню