为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...
我還記得大學(xué)實習(xí)面試時,被問到什么是線程池這個問題,因為這個題我被錄取了,原因就是我背出來了,而另外一個面試的沒背出來,說實話當(dāng)時還真不知道它是干什么的,就是看面試題給背下來了,在之后就是在實際開發(fā)中,確實使用到了。
首先說什么是線程池,為什么使用線程池?線程池就是提前創(chuàng)建若干個線程,如果有任務(wù)需要處理,線程池里的線程就會處理任務(wù),處理完之后線程并不會被銷毀,而是等待下一個任務(wù)。由于創(chuàng)建和銷毀線程都是消耗系統(tǒng)資源的,所以當(dāng)你想要頻繁的創(chuàng)建和銷毀線程的時候就可以考慮使用線程池來提升系統(tǒng)的性能。
Java中有三個比較常用的線程池,分別是FixedThreadPool,SingleThreadExecutor,CachedThreadPool。
1)FixedThreadPool
FixedThreadPool
這是一個線程數(shù)固定的線程池,當(dāng)這個線程池被創(chuàng)建的時候,池里的線程數(shù)就已經(jīng)固定了。當(dāng)需要運行的線程數(shù)量大體上變化不大時,適合使用這種線程池。固定數(shù)量還有一個好處,它可以一次性支付高昂的創(chuàng)建線程的開銷,之后再使用的時候就不再需要這種開銷。
2) SingleThreadExecutor
SingleThreadExecutor
這是一個線程數(shù)量為1的線程池,所有提交的這個線程池的任務(wù)都會按照提交的先后順序排隊執(zhí)行。單個線程執(zhí)行有個好處:由于任務(wù)之間沒有并發(fā)執(zhí)行,因此提交到線程池種的任務(wù)之間不會相互干擾。程序執(zhí)行的結(jié)果更具有確定性。
3) CachedThreadPool
CachedThreadPool
一看到Cache就知道這是一個和緩存有關(guān)的線程池,每次有任務(wù)提交到線程池的時候,如果池中沒有空閑的線程,線程池就會為這個任務(wù)創(chuàng)建一個線程,如果有空閑的線程,就會使用已有的空閑線程執(zhí)行任務(wù)。有的人可能會有個疑惑:這樣線程不就越來越多了嗎?其實不是的,這個線程池還有一個銷毀機制,如果一個線程60秒之內(nèi)沒有被使用過,這個線程就會被銷毀,這樣就節(jié)省了很多資源。
上面這3中在一般的小項目使用可以了,但是無限制的創(chuàng)建線程可能造成內(nèi)存溢出,因為上面的隊列都是無界限的,沒有設(shè)置大小。還有拒絕策略可能你不想使用默認的(AbortPolicy)。拒絕策略如圖:
拒絕策略
為什么說AbortPolicy是默認的,看下源碼
ThreadPoolExecutor
AbortPolicy
比如小編的項目中,就自定義一個線程池。定義隊列里的個數(shù)不能超過5個,策略還是使用默認策略,從上面的3中創(chuàng)建方式中,可以看得出他們都是通過ThreadPoolExecutor來創(chuàng)建的,所以我也是通過ThreadPoolExecutor來創(chuàng)建。
自定義
執(zhí)行
結(jié)果
這樣都隊列滿時,就會拋出異常。
總結(jié):
1、線程池是一個典型的“用空間換時間”的應(yīng)用案例,在線程池中始終維護一定數(shù)量的線程,這樣不必每次都創(chuàng)建新的線程,代價是線程即使空閑的時候也要占用內(nèi)存資源。當(dāng)需要頻繁創(chuàng)建和銷毀線程的時候,使用線程池可以顯著提高系統(tǒng)的運行效率。
2、自定義線程可以滿足我們控制隊列,避免造成內(nèi)存溢出,也能滿足我們設(shè)置對隊列滿時的拒絕策略。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: swag什么梗 swag的意思介绍
- 下一篇: 小皮筋的含义 小皮筋的含义是什么