thực hiện : Sử dụng nó cho lửa và quên cuộc gọi
đệ trình : Sử dụng nó để kiểm tra kết quả của cuộc gọi phương thức và thực hiện hành động thích hợpFuture
đối với cuộc gọi bị trả về
Từ javadocs
submit(Callable<T> task)
Gửi một tác vụ trả về giá trị để thực thi và trả về Tương lai biểu thị các kết quả đang chờ xử lý của tác vụ.
Future<?> submit(Runnable task)
Đệ trình một tác vụ Runnable để thực thi và trả về một Tương lai đại diện cho nhiệm vụ đó.
void execute(Runnable command)
Thực hiện lệnh đã cho tại một thời điểm nào đó trong tương lai. Lệnh có thể thực thi trong một luồng mới, trong một luồng được gộp chung hoặc trong luồng gọi, theo quyết định của việc thực thi Executor.
Bạn phải đề phòng trong khi sử dụng submit()
. Nó ẩn ngoại lệ trong chính khung trừ khi bạn nhúng mã tác vụ vào try{} catch{}
khối.
Mã ví dụ: 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()
bằng execute
():
Thay thế
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 trong khi sử dụng submit ()?
- Nhúng mã tác vụ của bạn (Thực hiện có thể chạy hoặc có thể gọi được) với thử {} bắt {} mã khối
- Triển khai 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);
}
}
đầu ra:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
Runnable
có được bao bọc trong mộtTask
hay không, mà bạn có thể không kiểm soát được. Ví dụ, nếu bạnExecutor
thực sự là mộtScheduledExecutorService
, nhiệm vụ của bạn sẽ được bao bọc trong mộtFuture
vàThrowable
không bị bắt sẽ bị ràng buộc với đối tượng này.