세 가지 유형의 예외를 반환하는 샘플 코드.
import java.util.concurrent.*;
import java.util.*;
public class ExceptionDemo{
public static void main(String args[]){
int poolSize=1;
int maxPoolSize=1;
int queueSize=30;
long aliveTive=60;
ArrayBlockingQueue<Runnable> queue= new ArrayBlockingQueue<Runnable>(queueSize);
ThreadPoolExecutor executor= new ThreadPoolExecutor(poolSize,maxPoolSize,aliveTive,
TimeUnit.MILLISECONDS,queue);
List<Future> futures = new ArrayList<Future>();
for (int i=0; i < 5; i++){
futures.add(executor.submit(new RunnableEx()));
}
for (Iterator it = futures.iterator(); it.hasNext();){
try {
Future f = (Future)it.next();
f.get(4000,TimeUnit.MILLISECONDS);
}catch(TimeoutException terr){
System.out.println("Timeout exception");
terr.printStackTrace();
}
catch(InterruptedException ierr){
System.out.println("Interrupted exception:");
ierr.printStackTrace();
}catch(ExecutionException err){
System.out.println("Exeuction exception:");
err.printStackTrace();
Thread.currentThread().interrupt();
}
}
executor.shutdown();
}
}
class RunnableEx implements Runnable{
public void run() {
// code in here
System.out.println("Thread name:"+Thread.currentThread().getName());
try{
Random r = new Random();
if (r.nextInt(2) == 1){
Thread.sleep(2000);
}else{
Thread.sleep(4000);
}
System.out.println("eee:"+1/0);
}catch(InterruptedException irr){
irr.printStackTrace();
}
}
}
출력 :
Thread name:pool-1-thread-1
Timeout exception
Thread name:pool-1-thread-1
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask.get(FutureTask.java:201)
at ExceptionDemo.main(ExceptionDemo.java:20)
Thread name:pool-1-thread-1
Exeuction exception:
java.util.concurrent.ExecutionException: java.lang.ArithmeticException:/by zero
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:202)
at ExceptionDemo.main(ExceptionDemo.java:20)
Caused by: java.lang.ArithmeticException:/by zero
at RunnableEx.run(ExceptionDemo.java:49)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Interrupted exception:
java.lang.InterruptedException
at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:400)
at java.util.concurrent.FutureTask.get(FutureTask.java:199)
at ExceptionDemo.main(ExceptionDemo.java:20)
Timeout exception
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask.get(FutureTask.java:201)
Thread name:pool-1-thread-1
at ExceptionDemo.main(ExceptionDemo.java:20)
Thread name:pool-1-thread-1
Timeout exception
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask.get(FutureTask.java:201)
at ExceptionDemo.main(ExceptionDemo.java:20)
TimeoutException :시 차단 동작이 타임 아웃 발생 예외. 위의 예에서
, 일부 작업은 많은 시간 (4 초 인해 수면)을 고려하여 제한 시간을 증가 시키거나의 Runnable 작업을 최적화 어느 Future
에 get()
의 작동을 차단한다.
ExecutionException : 예외 발생에 의해 중단 된 태스크의 결과를 취득하려고 => 계산 예외
위의 예에서
던질 때이 Exception
일반적 ArithmeticException:/by zero
통해 시뮬레이션 슬로우 예외 예제에서 인용 된 것처럼 사소한 것이라면 근본 원인을 수정해야합니다.
InterruptedException : 스레드가 대기 중이거나 대기 중이거나 점유 중이며 스레드가 활동 전이나 도중에 중단되면 발생합니다.
위의 예에서이 Exception
은 ExecutionException
동안 현재 스레드를 인터럽트하여 시뮬레이트됩니다.
일반적으로 잡아서는 안됩니다.
작업 처리 중 예외가 발생하면 ExecutionException이 throw되는 것을 방지 할 수있는 방법이 있습니까? 처리에서 Exception throws를 잡아서 처리하더라도 여전히 ExecutionException에 대한 예외를 래핑하고 get에 throw합니다. –
InterruptedException과 ExecutionException 사이에 관계가 있으며, 어느 것이 먼저 catch되는지 알아야합니다. SO 질문에서 그는 InterruptedException을 먼저 catch 한 다음 ExecutionException을 catch합니다. 주문을 교환하면 문제는 동일합니까? – prime
@prime : https://stackoverflow.com/a/10964899/217324를 참조하십시오. 두 예외 모두 예외를 확장하고 다른 예외보다 더 구체적이지 않습니다. 이 경우 주문은 중요하지 않습니다. –