日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

submit与execute区别

發(fā)布時(shí)間:2024/1/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 submit与execute区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(1)可以接受的任務(wù)類型

? ? ? ? ? ? ? ?submit:

? ? ? ? ? ? ? ?

? ? ? ? ? ? ? execute:

? ? ? ? ? ? ??

? ? ? ? ? ? ?可以看出:

? ? ? ? ? ? ? ? ? ? ? ? execute只能接受Runnable類型的任務(wù)

? ? ? ? ? ? ? ? ? ? ? ? submit不管是Runnable還是Callable類型的任務(wù)都可以接受,但是Runnable返回值均為void,所以使用Future的get()獲得的還是null

(2)返回值

? ? ? ? ? ? ? ? 由Callable和Runnable的區(qū)別可知:

? ? ? ? ? ? ? ? execute沒有返回值

? ? ? ? ? ? ? ? submit有返回值,所以需要返回值的時(shí)候必須使用submit

(3)異常

? ? ? ? ? ? ? ??1.execute中拋出異常

? ? ? ? ? ? ? ? ? ? execute中的是Runnable接口的實(shí)現(xiàn),所以只能使用try、catch來捕獲CheckedException,通過實(shí)現(xiàn)UncaughtExceptionHande接口處理UncheckedException

? ? ? ? ? ? ? ? ? ? 即和普通線程的處理方式完全一致

? ? ? ? ? ? ? ??2.submit中拋出異常

? ? ? ? ? ? ? ? ? ?不管提交的是Runnable還是Callable類型的任務(wù),如果不對返回值Future調(diào)用get()方法,都會(huì)吃掉異常

? ? ? ? ? ? ? ? ? ?先來看下Callable定義

  • public interface Callable<V> {

  • ?
  • V call() throws Exception;

  • ?
  • }

  • ?

    ? ? ? ? ? ? ? ? ? ?其中的call能夠拋出Exception異常,所以不管是CheckedException還是UncheckedException,直接拋出即可

  • import java.util.concurrent.Callable;

  • ?
  • import java.util.concurrent.ExecutionException;

  • ?
  • import java.util.concurrent.ExecutorService;

  • ?
  • import java.util.concurrent.Executors;

  • ?
  • import java.util.concurrent.Future;

  • ?
  • ?
  • public class ThreadExceptionTest {

  • ?
  • public static void main(String[] args) {

  • ?
  • ExecutorService executor = Executors.newCachedThreadPool();

  • ?
  • ?
  • Future<Boolean> future = executor.submit(new CallableTask());

  • ?
  • try {

  • ?
  • future.get();

  • ?
  • } catch (InterruptedException e) {

  • ?
  • e.printStackTrace();

  • ?
  • } catch (ExecutionException e) {

  • ?
  • e.printStackTrace();

  • ?
  • }

  • ?
  • ?
  • executor.shutdown();//必須不能忘,否則會(huì)一致卡在那里

  • ?
  • }

  • ?
  • }

  • class CallableTask implements Callable<Boolean>{

  • ?
  • public Boolean call() throws Exception {

  • ?
  • // InputStream in = new FileInputStream(new File("xx.pdf"));

  • ?
  • int num = 3/0;

  • ?
  • return false;

  • ?
  • }

  • ?
  • ?
  • }

  • ?

    ? ? ? ? ? ? ? ? ? 結(jié)果為:

    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)

    總結(jié)

    以上是生活随笔為你收集整理的submit与execute区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。