Как мне отменить это задачи, которые выполняются слишком долго с использованием CompletionService

Я отправляю некоторые будущие задачи, используя CompletionService, обернутый вокруг 2-х потокового FixedThreadPool ExecutorService, затем устанавливаю цикл, равный количеству отправленных задач, и использую completeservice.take (), ожидая их завершения или сбоя. Проблема в том, что очень редко она никогда не заканчивается (но я не знаю почему), поэтому я изменил метод take () на опрос (300, Timeout.SECONDS), идея заключалась в том, что одна задача занимает больше 5 минут, чтобы выполнить это опрос завершится неудачно, а затем в конечном итоге выйду из цикла, и я могу просмотреть все фьючерсы и вызвать future.cancel (true), чтобы принудительно отменить проблемную задачу.

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

Я хочу прервать / принудительно отменить текущую задачу, если она не завершена через 5 минут, но я не вижу никакого способа сделать это.

В этом примере кода показана упрощенная версия того, о чем я говорю

import com.jthink.jaikoz.exception.JaikozException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;

public class CompletionServiceTest
{
    public static void main(final String[] args)
    {
        CompletionService<Boolean>  cs = new ExecutorCompletionService<Boolean>(Executors.newFixedThreadPool(2));
        Collection<Worker> tasks = new ArrayList<Worker>(10);
        tasks.add(new Worker(1));
        tasks.add(new Worker(2));
        tasks.add(new Worker(3));
        tasks.add(new Worker(4));
        tasks.add(new Worker(5));
        tasks.add(new Worker(6));

        List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>(tasks.size());
        try
        {
            for (Callable task : tasks)
            {
                futures.add(cs.submit(task));
            }
            for (int t = 0; t < futures.size(); t++)
            {
                Future<Boolean> result = cs.poll(10, TimeUnit.SECONDS);
                if(result==null)
                {
                    System.out.println("Worker TimedOut:");
                    continue;
                }
                else
                {
                    try
                    {
                        if(result.isDone() && result.get())
                        {
                            System.out.println("Worker Completed:");
                        }
                        else
                        {
                            System.out.println("Worker Failed");
                        }
                    }
                    catch (ExecutionException ee)
                    {
                        ee.printStackTrace();
                    }
                }
            }
       }
        catch (InterruptedException ie)
        {
        }
        finally
        {
            //Cancel by interrupting any existing tasks currently running in Executor Service
            for (Future<Boolean> f : futures)
            {
                f.cancel(true);
            }
        }
        System.out.println("Done");
    }
}

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

    public Boolean call()
    {
        if(number==3)
        {
            try
            {
                Thread.sleep(50000);
            }
            catch(InterruptedException tie)
            {

            }
        }
        return true;
    }
}

Выходные данные

Worker Completed:
Worker Completed:
Worker Completed:
Worker Completed:
Worker Completed:
Worker TimedOut:
Done
5
задан Paul Taylor 10 March 2011 в 20:28
поделиться