10.4submit与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定义

[java]  view plain  copy
  1. public interface Callable<V> {  
  2.     V call() throws Exception;  
  3. }  
                    其中的call能够抛出Exception异常,所以不管是CheckedException还是UncheckedException,直接抛出即可

[java]  view plain  copy
  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. }  
                  结果为:

[plain]  view plain  copy
  1. java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero  
  2.     at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)  
  3.     at java.util.concurrent.FutureTask.get(FutureTask.java:83)  
  4.     at my.ThreadExceptionTest.main(ThreadExceptionTest.java:21)  
  5. Caused by: java.lang.ArithmeticException: / by zero  
  6.     at my.CallableTask.call(ThreadExceptionTest.java:57)  
  7.     at my.CallableTask.call(ThreadExceptionTest.java:1)  
  8.     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)  
  9.     at java.util.concurrent.FutureTask.run(FutureTask.java:138)  
  10.     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)  
  11.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)  
  12.     at java.lang.Thread.run(Thread.java:619)  

猜你喜欢

转载自blog.csdn.net/qq_18048847/article/details/80495974