CompletionService를 사용하여 몇 가지 Future tasks를 제출합니다. FixedThreadPool ExecutorService 2 라운드를 포장 한 다음 제출 된 작업 수와 동일한 루프를 설정하고 completionservice를 사용합니다. take() 그들 모두가 완료되거나 실패 할 때까지 기다린다. 문제는 아주 가끔씩 끝나지 않습니다. (하지만 그 이유는 모르겠습니다.) 그래서 take() 메소드를 설문 (300, Timeout.SECONDS)으로 변경했습니다. 하나의 태스크가 완료되는 데 5 분 이상이 소요된다면 아이디어가됩니다. 설문 조사는 실패 할 것이고 결국에는 루프에서 벗어나서 모든 미래를 거쳐 future.cancel (true)로 전화하여 문제가되는 작업을 취소 할 수 있습니다.CompletionService를 사용하여 너무 오래 걸리는 작업을 취소하는 방법
그러나 코드를 실행하면 코드가 멈추고 폴링이 5 분마다 한 번씩 계속 실행되고 더 이상 작업이 실행되지 않아 두 작업자가 어떤 방식 으로든 교착 상태에 빠졌다고 가정하고 추가 작업을 허용하지 않습니다. 시작한다. 타임 아웃이 5 분이고 루프를 돌리는 데 걸린 시간을 실행하는 데 여전히 1000 개의 작업이 있었기 때문에 작업이 너무 길어 취소되었습니다.
5 분 안에 hasnt가 완료되면 interupt/force cancellation이 현재 작업을 수행하지만 어떤 일도 할 수 없습니다.
이 코드 샘플 임, 당신의 호출 가능 중단을 지원하는 통화 차단에 대한
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
@ user294896 - 작고 독립적 인 예제로 몇 가지 샘플 코드를 제공 할 수 있습니까? – justkt
@justkt 조금만 걸릴 수도 있습니다 –
왜 작업 자체가 너무 오래 걸리고 중단된다는 것을 깨닫지 못합니까? 이것은 크게 단순화합니다. – trojanfoe