실행 : 화재에 사용하고 전화를 잊어
제출 : 메소드 호출 결과를 검사하고 호출에Future
의해 리턴 된오브젝트에대해적절한 조치를 수행하는 데 사용하십시오.
에서 의 javadoc
submit(Callable<T> task)
실행을 위해 가치 반환 작업을 제출하고 보류중인 작업 결과를 나타내는 Future를 반환합니다.
Future<?> submit(Runnable task)
실행 가능한 실행 가능 태스크를 제출하고 해당 태스크를 나타내는 Future를 리턴합니다.
void execute(Runnable command)
나중에 언젠가 주어진 명령을 실행합니다. 명령은 실행기 구현의 재량에 따라 새 스레드, 풀링 된 스레드 또는 호출 스레드에서 실행될 수 있습니다.
를 사용하는 동안 예방 조치를 취해야 submit()
합니다. 작업 코드를 try{} catch{}
블록에 포함시키지 않으면 프레임 워크 자체에서 예외가 숨겨 집니다.
예제 코드 : 이 코드는 제비 Arithmetic exception : / by zero
입니다.
import java.util.concurrent.*;
import java.util.*;
public class ExecuteSubmitDemo{
public ExecuteSubmitDemo()
{
System.out.println("creating service");
ExecutorService service = Executors.newFixedThreadPool(10);
//ExtendedExecutor service = new ExtendedExecutor();
service.submit(new Runnable(){
public void run(){
int a=4, b = 0;
System.out.println("a and b="+a+":"+b);
System.out.println("a/b:"+(a/b));
System.out.println("Thread Name in Runnable after divide by zero:"+Thread.currentThread().getName());
}
});
service.shutdown();
}
public static void main(String args[]){
ExecuteSubmitDemo demo = new ExecuteSubmitDemo();
}
}
산출:
java ExecuteSubmitDemo
creating service
a and b=4:0
() 로 대체 submit()
하여 동일한 코드가 발생합니다 execute
.
바꾸다
service.submit(new Runnable(){
와
service.execute(new Runnable(){
산출:
java ExecuteSubmitDemo
creating service
a and b=4:0
Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
at ExecuteSubmitDemo$1.run(ExecuteSubmitDemo.java:14)
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)
submit ()을 사용하는 동안 이러한 유형의 시나리오를 처리하는 방법은 무엇입니까?
- try {} catch {} 블록 코드를 사용 하여 작업 코드 ( Runnable 또는 Callable 구현 중 하나)를 포함 시킵니다.
- 도구
CustomThreadPoolExecutor
새로운 솔루션 :
import java.util.concurrent.*;
import java.util.*;
public class ExecuteSubmitDemo{
public ExecuteSubmitDemo()
{
System.out.println("creating service");
//ExecutorService service = Executors.newFixedThreadPool(10);
ExtendedExecutor service = new ExtendedExecutor();
service.submit(new Runnable(){
public void run(){
int a=4, b = 0;
System.out.println("a and b="+a+":"+b);
System.out.println("a/b:"+(a/b));
System.out.println("Thread Name in Runnable after divide by zero:"+Thread.currentThread().getName());
}
});
service.shutdown();
}
public static void main(String args[]){
ExecuteSubmitDemo demo = new ExecuteSubmitDemo();
}
}
class ExtendedExecutor extends ThreadPoolExecutor {
public ExtendedExecutor() {
super(1,1,60,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(100));
}
// ...
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Object result = ((Future<?>) r).get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
if (t != null)
System.out.println(t);
}
}
산출:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
Runnable
랩핑 여부에 따라 달라 지므로 보장Task
되지 않습니다. 예를 들어 yourExecutor
가 실제로 인 경우ScheduledExecutorService
작업이 내부적으로 래핑Future
되고 잡히지 않은Throwable
이 개체에 바인딩됩니다.