zoukankan      html  css  js  c++  java
  • submit与execute区别

    (1)可以接受的任务类型

                   submit:

                   

                  execute:

                  

                 可以看出:

                            execute只能接受Runnable类型的任务

                            submit不管是Runnable还是Callable类型的任务都可以接受,但是Runnable返回值均为void,所以使用Future的get()获得的还是null

    (2)返回值

                    由Callable和Runnable的区别可知:

                    execute没有返回值

                    submit有返回值,所以需要返回值的时候必须使用submit

    (3)异常

                    1.execute中抛出异常

                        execute中的是Runnable接口的实现,所以只能使用try、catch来捕获CheckedException,通过实现UncaughtExceptionHande接口处理UncheckedException

                        即和普通线程的处理方式完全一致

                    2.submit中抛出异常

                       不管提交的是Runnable还是Callable类型的任务,如果不对返回值Future调用get()方法,都会吃掉异常

                       先来看下Callable定义

    1.  
      public interface Callable<V> {
    2.  
      V call() throws Exception;
    3.  
      }

                        其中的call能够抛出Exception异常,所以不管是CheckedException还是UncheckedException,直接抛出即可

    1.  
      import java.util.concurrent.Callable;
    2.  
      import java.util.concurrent.ExecutionException;
    3.  
      import java.util.concurrent.ExecutorService;
    4.  
      import java.util.concurrent.Executors;
    5.  
      import java.util.concurrent.Future;
    6.  
       
    7.  
      public class ThreadExceptionTest {
    8.  
      public static void main(String[] args) {
    9.  
      ExecutorService executor = Executors.newCachedThreadPool();
    10.  
       
    11.  
      Future<Boolean> future = executor.submit(new CallableTask());
    12.  
      try {
    13.  
      future.get();
    14.  
      } catch (InterruptedException e) {
    15.  
      e.printStackTrace();
    16.  
      } catch (ExecutionException e) {
    17.  
      e.printStackTrace();
    18.  
      }
    19.  
       
    20.  
      executor.shutdown();//必须不能忘,否则会一致卡在那里
    21.  
      }
    22.  
      }
    23.  
       
    24.  
      class CallableTask implements Callable<Boolean>{
    25.  
      public Boolean call() throws Exception {
    26.  
      // InputStream in = new FileInputStream(new File("xx.pdf"));
    27.  
      int num = 3/0;
    28.  
      return false;
    29.  
      }
    30.  
       
    31.  
      }

                      结果为:

    java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
    	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
    	at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    	at my.ThreadExceptionTest.main(ThreadExceptionTest.java:21)
    Caused by: java.lang.ArithmeticException: / by zero
    	at my.CallableTask.call(ThreadExceptionTest.java:57)
    	at my.CallableTask.call(ThreadExceptionTest.java:1)
    	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    	at java.lang.Thread.run(Thread.java:619)
    
  • 相关阅读:
    【Javascript】javascript学习 二十二 JavaScript 对象简介
    【Javascript】javascript学习 二十六 JavaScript Boolean(逻辑)对象
    【Javascript】javascript学习 二十九 JavaScript HTML DOM 对象
    【Javascript】javascript学习 二十八 JavaScript RegExp 对象
    【Javascript】javascript学习 二十一 JavaScript 指导方针
    【Javascript】javascript学习 二十三 JavaScript 字符串(String)对象
    【Javascript】javascript学习 三十 JavaScript 浏览器检测
    【Javascript】javascript学习 二十五 JavaScript Array(数组)对象
    【Javascript】javascript学习 二十四 JavaScript Date(日期)对象
    【Javascript】javascript学习 二十七 JavaScript Math(算数)对象
  • 原文地址:https://www.cnblogs.com/cxy2020/p/13738332.html
Copyright © 2011-2022 走看看