mengeksekusi : Gunakan untuk api dan lupakan panggilan
kirim : Gunakan untuk memeriksa hasil pemanggilan metode dan mengambil tindakan yang sesuai padaFuture
keberatan yang dikembalikan oleh pemanggilan
Dari javadocs
submit(Callable<T> task)
Mengirimkan tugas pengembalian nilai untuk dieksekusi dan mengembalikan Masa Depan yang mewakili hasil tugas yang tertunda.
Future<?> submit(Runnable task)
Mengirimkan tugas yang dapat dijalankan untuk dieksekusi dan mengembalikan Masa Depan yang mewakili tugas itu.
void execute(Runnable command)
Menjalankan perintah yang diberikan di beberapa waktu di masa depan. Perintah dapat mengeksekusi di utas baru, dalam utas yang dikumpulkan, atau dalam utas panggilan, atas kebijaksanaan implementasi Pelaksana.
Anda harus berhati-hati saat menggunakan submit()
. Itu menyembunyikan pengecualian dalam kerangka itu sendiri kecuali jika Anda menanamkan kode tugas Anda di try{} catch{}
blok.
Kode contoh: Kode ini tertelan 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();
}
}
keluaran:
java ExecuteSubmitDemo
creating service
a and b=4:0
Melemparkan kode yang sama dengan mengganti submit()
dengan execute
():
Menggantikan
service.submit(new Runnable(){
dengan
service.execute(new Runnable(){
keluaran:
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)
Bagaimana menangani jenis skenario ini saat menggunakan kirim ()?
- Sematkan kode Tugas Anda ( Baik Implementasi Runnable atau Callable) dengan coba {} catch {} kode blokir
- Melaksanakan
CustomThreadPoolExecutor
Solusi baru:
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);
}
}
keluaran:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
Runnable
akan dibungkusTask
atau tidak, yang mungkin tidak Anda kendalikan. Misalnya, jika AndaExecutor
benar-benar seorangScheduledExecutorService
, tugas Anda secara internal akan dibungkusFuture
dan tidakThrowable
terikat akan terikat pada objek ini.