execute : Yangın için kullanın ve çağrıları unutun
gönder : Yöntem çağrısının sonucunu incelemek ve çağrıFuture
tarafından döndürülen itirazüzerine uygun işlemi yapmak için kullanın
Gönderen javadocs
submit(Callable<T> task)
Yürütme için değer döndüren bir görev gönderir ve görevin bekleyen sonuçlarını temsil eden bir Gelecek döndürür.
Future<?> submit(Runnable task)
Yürütülebilir bir yürütme görevi gönderir ve bu görevi temsil eden bir Gelecek döndürür.
void execute(Runnable command)
Verilen komutu gelecekte bir zamanda yürütür. Komut, Yürütücü uygulamasının takdirine bağlı olarak yeni bir iş parçacığında, birleştirilmiş bir iş parçacığında veya çağıran iş parçacığında yürütülebilir.
Kullanırken önlem almanız gerekir submit()
. Görev kodunuzu try{} catch{}
bloğa gömmediğiniz sürece istisna çerçevenin kendisinde gizler .
Örnek kod: Bu kod yutulur 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();
}
}
çıktı:
java ExecuteSubmitDemo
creating service
a and b=4:0
Aynı kod () submit()
ile değiştirilerek atılır execute
:
değiştirmek
service.submit(new Runnable(){
ile
service.execute(new Runnable(){
çıktı:
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 () kullanılırken bu tür senaryolar nasıl ele alınır?
- {} Catch {} blok kodunu deneyin ile Görev kodunuzu ( Çalıştırılabilir veya Çağrılabilir uygulama) gömün
- uygulamak
CustomThreadPoolExecutor
Yeni çözüm:
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);
}
}
çıktı:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
Runnable
sarılıp sarılmayacağına bağlı olup olmadığının garanti edilmediğini unutmayınTask
. Örneğin, eğerExecutor
gerçekten bir aScheduledExecutorService
ise, göreviniz dahili olarak bir sarılırFuture
ve yakalanmayanlarThrowable
bu nesneye bağlanır.