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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我還記得大學實習面試時,被問到什么是線程池這個問題,因為這個題我被錄取了,原因就是我背出來了,而另外一個面試的沒背出來,說實話當時還真不知道它是干什么的,就是看面試題給背下來了,在之后就是在實際開發中,確實使用到了。

首先說什么是線程池,為什么使用線程池?線程池就是提前創建若干個線程,如果有任務需要處理,線程池里的線程就會處理任務,處理完之后線程并不會被銷毀,而是等待下一個任務。由于創建和銷毀線程都是消耗系統資源的,所以當你想要頻繁的創建和銷毀線程的時候就可以考慮使用線程池來提升系統的性能。

Java中有三個比較常用的線程池,分別是FixedThreadPool,SingleThreadExecutor,CachedThreadPool。

1)FixedThreadPool

FixedThreadPool

這是一個線程數固定的線程池,當這個線程池被創建的時候,池里的線程數就已經固定了。當需要運行的線程數量大體上變化不大時,適合使用這種線程池。固定數量還有一個好處,它可以一次性支付高昂的創建線程的開銷,之后再使用的時候就不再需要這種開銷。

2) SingleThreadExecutor

SingleThreadExecutor

這是一個線程數量為1的線程池,所有提交的這個線程池的任務都會按照提交的先后順序排隊執行。單個線程執行有個好處:由于任務之間沒有并發執行,因此提交到線程池種的任務之間不會相互干擾。程序執行的結果更具有確定性。

3) CachedThreadPool

CachedThreadPool

一看到Cache就知道這是一個和緩存有關的線程池,每次有任務提交到線程池的時候,如果池中沒有空閑的線程,線程池就會為這個任務創建一個線程,如果有空閑的線程,就會使用已有的空閑線程執行任務。有的人可能會有個疑惑:這樣線程不就越來越多了嗎?其實不是的,這個線程池還有一個銷毀機制,如果一個線程60秒之內沒有被使用過,這個線程就會被銷毀,這樣就節省了很多資源。

上面這3中在一般的小項目使用可以了,但是無限制的創建線程可能造成內存溢出,因為上面的隊列都是無界限的,沒有設置大小。還有拒絕策略可能你不想使用默認的(AbortPolicy)。拒絕策略如圖:

拒絕策略

為什么說AbortPolicy是默認的,看下源碼

ThreadPoolExecutor

AbortPolicy

比如小編的項目中,就自定義一個線程池。定義隊列里的個數不能超過5個,策略還是使用默認策略,從上面的3中創建方式中,可以看得出他們都是通過ThreadPoolExecutor來創建的,所以我也是通過ThreadPoolExecutor來創建。

自定義

執行

結果

這樣都隊列滿時,就會拋出異常。
總結:

1、線程池是一個典型的“用空間換時間”的應用案例,在線程池中始終維護一定數量的線程,這樣不必每次都創建新的線程,代價是線程即使空閑的時候也要占用內存資源。當需要頻繁創建和銷毀線程的時候,使用線程池可以顯著提高系統的運行效率。

2、自定義線程可以滿足我們控制隊列,避免造成內存溢出,也能滿足我們設置對隊列滿時的拒絕策略。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。