成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程池的Execute方法和Submit方法有什么區別?

網絡 通信技術
文章內容很聚焦,但干貨十足。不注意的話你可能會落入陷阱。concurrent包里的ExecutorService,是一個接口,繼承的是Executor,而Executor里只有一個方法。

 [[335211]]

本文轉載自微信公眾號「小姐姐味道」,作者小姐姐養的狗 。轉載本文請聯系小姐姐味道公眾號。

文章內容很聚焦,但干貨十足。不注意的話你可能會落入陷阱。

concurrent包里的ExecutorService,是一個接口,繼承的是Executor,而Executor里只有一個方法。

  1. public interface Executor { 
  2.     void execute(Runnable command); 

這就是execute方法,接受一個runnable,然后返回為空。也就是說,它接受任務之后,就靜悄悄異步去運行了。

我們再來看submit方法。區別就是submit方法,會返回一個Future對象。顯然它是比execute方法多了一些內容的。

  1. <T> Future<T> submit(Callable<T> task); 
  2. <T> Future<T> submit(Runnable task, T result); 
  3. Future<?> submit(Runnable task); 

問題

我們嘗試運行以下代碼:

  1. ExecutorService service = Executors.newFixedThreadPool(1); 
  2. Runnable r = () -> System.out.println(1 / 0); 
  3. service.submit(r); 
  4. service.shutdown(); 

程序靜悄悄的什么都沒有輸出,異常沒有,日志也沒有,我們的錯誤直接被吞掉了。

把submit方法換成execute方法,可以看到異常能夠正常輸出。為了避免抄襲,我還是輸出一些自定義的堆棧吧。

  1. Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero 
  2.     at com.github.xjjdog.pool.AAA.lambda$main$0(AAA.java:13) 
  3.     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
  4.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
  5.     at java.lang.Thread.run(Thread.java:748) 

但它也僅僅是輸出而已,我們無法使用logback之類的日志框架對其進行記錄,因為它這個打印動作我們是不可控的。

解決方法

首先看下submit 方式的解決方法。通過返回的Future,執行它的get方法,即可獲取完成的錯誤堆棧。

  1. ExecutorService service = Executors.newFixedThreadPool(1); 
  2. Runnable r = () -> System.out.println(1 / 0); 
  3. Future f = service.submit(r); 
  4. f.get(); 
  5. service.shutdown(); 

下面是輸出結果。

  1. Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero 
  2.     at java.util.concurrent.FutureTask.report(FutureTask.java:122) 
  3.     at java.util.concurrent.FutureTask.get(FutureTask.java:192) 
  4.     at com.github.xjjdog.pool.AAA.main(AAA.java:20) 
  5. Caused by: java.lang.ArithmeticException: / by zero 
  6.     at com.github.xjjdog.pool.AAA.lambda$main$0(AAA.java:16) 
  7.     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
  8.     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
  9.     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
  10.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
  11.     at java.lang.Thread.run(Thread.java:748) 

但我們平常情況下,使用Future的時候并不多,因為它會阻塞我們的請求。

你可能懷疑不調用get,我們的代碼沒有運行,其實不是的。把runnable改成如下代碼,不調用get方法,發現程序只輸出了一個a。

  1. Runnable r = () -> { 
  2.     System.out.println("a"); 
  3.     System.out.println(1 / 0); 
  4. }; 

真是讓人惱火啊,想要拋出異常,還是使用execute方便一些。

但我們上面說到,execute的方式,錯誤也是無法捕捉。其實我們可以曲線救國的繞一下去解決。解決方式就是使用ThreadFactory,實現它的UncaughtExceptionHandler。具體代碼如下:

  1. ThreadFactory factory = r->{ 
  2.     Thread thread = Executors.defaultThreadFactory().newThread(r); 
  3.     thread.setUncaughtExceptionHandler( (t,e) -> { 
  4.         System.out.println(t + "" + e); 
  5.         e.printStackTrace();//example 
  6.     }); 
  7.     return thread ; 
  8. }; 
  9.  
  10. ExecutorService service = Executors.newFixedThreadPool(1,factory); 
  11. Runnable r = () -> { 
  12.     System.out.println("a"); 
  13.     System.out.println(1 / 0); 
  14. }; 
  15.  
  16. service.execute(r); 
  17. service.shutdown(); 

運行之后,能夠看到我們的自定義異常捕獲。

  1. Thread[pool-1-thread-1,5,main]java.lang.ArithmeticException: / by zero 

EndJava線程池對于異常處理的這些默認行為,以及差別,我是特別抵觸的。可以說兩種默認行為都很low,我們還需要處理很多動作,才能捕捉到合適的異常。

多線程編程本來就難,又搞出這么兩套東西來。找個日志吧,習慣性的往項目的error日志里去找,并沒有。真是苦了開發同學。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。

 

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2013-07-30 13:35:12

methodfunction

2024-07-15 08:20:24

2022-02-08 07:02:32

進程線程操作系統

2022-01-11 06:53:23

面試重寫重載

2022-03-16 07:33:40

守護線程用戶線程語言

2022-08-31 08:33:54

Bash操作系統Linux

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發編程線程

2022-06-06 14:53:02

LoRaLoRaWAN

2022-09-08 18:38:26

LinuxWindowsmacOS

2020-11-09 14:07:53

PyQtQt編程

2021-12-17 14:40:02

while(1)for(;;)語言

2022-02-27 15:33:22

安全CASBSASE

2024-05-27 00:40:00

2021-05-16 14:26:08

RPAIPACIO

2022-08-02 08:23:37

SessionCookies

2024-09-09 13:10:14

2024-03-05 18:59:59

前端開發localhost

2018-07-20 14:00:51

LinuxmacOS內核

2023-12-15 09:21:17

ObjectJavaString
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品久久久 | 99精品国产一区二区青青牛奶 | 99精品久久久| 天天天天操 | 狠狠的干| 自拍偷拍第一页 | 国产精品久久亚洲 | 精精国产xxxx视频在线播放 | 欧美日本亚洲 | 精品国产一区二区在线 | av高清 | 91人人在线| 欧美视频在线播放 | 91av精品 | 久久久91精品国产一区二区三区 | 精品美女视频在免费观看 | 中文字幕韩在线第一页 | 在线观看国产wwwa级羞羞视频 | 91精品国产91久久久久游泳池 | 国产一区二区三区高清 | 天天草狠狠干 | 日韩欧美一级精品久久 | 性高湖久久久久久久久3小时 | 九九色综合 | 国产羞羞视频在线观看 | 337p日韩| 国产在线精品一区二区三区 | www日本在线播放 | 免费精品 | 男人天堂网址 | 欧美日韩专区 | 天天操夜夜操 | 欧美性生交大片免费 | 成人免费在线视频 | 91视视频在线观看入口直接观看 | 欧美国产精品久久久 | 色男人天堂av | 亚洲一区二区久久久 | 亚洲36d大奶网 | 欧美区在线 | 中文字幕欧美一区 |