Я отправляю некоторые будущие задачи, используя 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