Looking for java Keywords? Try Ask4Keywords

Java Language Отправить () vs execute () отличия обработки исключений


пример

Обычно команда execute () используется для вызовов огня и забвения (без необходимости анализа результата), а команда submit () используется для анализа результата объекта Future.

Мы должны знать о ключевой разнице механизмов обработки исключений между этими двумя командами.

Исключения из submit () проглатываются каркасом, если вы их не поймали.

Пример кода, чтобы понять разницу:

Случай 1: подайте команду Runnable with execute (), которая сообщает об исключении.

import java.util.concurrent.*;
import java.util.*;

public class ExecuteSubmitDemo {
    public ExecuteSubmitDemo() {
        System.out.println("creating service");
        ExecutorService service = Executors.newFixedThreadPool(2);
        //ExtendedExecutor service = new ExtendedExecutor();
        for (int i = 0; i < 2; i++){
            service.execute(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);
   }
 }

выход:

creating service
a and b=4:0
a and b=4:0
Exception in thread "pool-1-thread-1" Exception in thread "pool-1-thread-2" java.lang.ArithmeticException: / by zero
        at ExecuteSubmitDemo$1.run(ExecuteSubmitDemo.java:15)
        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)
java.lang.ArithmeticException: / by zero
        at ExecuteSubmitDemo$1.run(ExecuteSubmitDemo.java:15)
        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)

Случай 2: Заменить execute () с помощью submit (): service.submit(new Runnable(){ В этом случае Исключения проглатываются инфраструктурой, так как метод run () не обнаружил их явно.

выход:

creating service
a and b=4:0
a and b=4:0

Случай 3: измените newFixedThreadPool на ExtendedExecutor

//ExecutorService service = Executors.newFixedThreadPool(2);
 ExtendedExecutor service = new ExtendedExecutor(); 

выход:

creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
a and b=4:0
java.lang.ArithmeticException: / by zero

Я продемонстрировал этот пример, чтобы охватить две темы: используйте свой собственный ThreadPoolExecutor и обработайте Exectpion с помощью пользовательского ThreadPoolExecutor.

Другое простое решение вышеуказанной проблемы: когда вы используете обычную команду ExecutorService & submit, получите объект Future из submit () команды call get () API on Future. Вызовите три исключения, которые были указаны в реализации метода afterExecute. Преимущество пользовательского ThreadPoolExecutor по этому подходу: вы должны обрабатывать механизм обработки исключений только в одном месте - Custom ThreadPoolExecutor.