thực hiện: Sử dụng nó cho lửa và quên đi cuộc gọi
nộp: Sử dụng nó để kiểm tra kết quả của lời gọi phương thức và có hành động thích hợp trên Future
phản đối được trả về bởi các cuộc gọi
Từ javadocs
submit(Callable<T> task)
Gửi nhiệm vụ trả về giá trị để thực thi và trả về Tương lai trình bày kết quả đang chờ xử lý.
Future<?> submit(Runnable task)
nộp một nhiệm vụ Runnable để thực hiện và trả về một tương lai đại diện cho rằng nhiệm vụ.
void execute(Runnable command)
Thực thi các lệnh được đưa ra tại một số thời gian trong tương lai. Lệnh này có thể thực hiện trong một luồng mới, trong một luồng gộp, hoặc trong chuỗi gọi, theo quyết định của việc thực thi Executor.
Bạn phải thận trọng khi sử dụng submit()
. Nó ẩn ngoại lệ trong khung chính nó trừ khi bạn nhúng mã tác vụ của mình vào khối try{} catch{}
.
Mã mẫu: Mã này nuốt 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();
}
}
đầu ra:
java ExecuteSubmitDemo
creating service
a and b=4:0
cùng một mã ném bằng cách thay thế submit()
với execute
():
Thay
service.submit(new Runnable(){
với
service.execute(new Runnable(){
đầu ra:
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)
Làm thế nào để xử lý các loại kịch bản khi sử dụng trình()?
- Nhúng mã của bạn Task (Hoặc Runnable hoặc Callable thực hiện) với try {} catch {} khối mã
- Thực hiện
CustomThreadPoolExecutor
giải pháp mới:
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);
}
}
kết quả đầu ra:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException:/by zero
Lưu ý rằng hành vi này không được đảm bảo vì nó phụ thuộc vào việc 'Runnable' của bạn có được bao bọc trong một' Task' hay không, mà bạn có thể không kiểm soát được. Ví dụ, nếu 'Executor' của bạn thực sự là một' ScheduledExecutorService', nhiệm vụ của bạn sẽ được bọc trong một 'Future' và uncaught' Throwable 'sẽ bị ràng buộc với đối tượng này. – rxg
Tôi có nghĩa là 'bọc trong' Tương lai 'hay không', tất nhiên. Xem Javadoc cho [ScheduledThreadPoolExecutor # execute] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html#execute (java.lang.Runnable)), ví dụ . – rxg