万万没想到,线程居然被饿死了!
我們在構(gòu)建線程池的時(shí)候可以構(gòu)建單個(gè)線程的線程池和多個(gè)線程的線程池。
那么線程池使用不當(dāng)可不可能產(chǎn)生死鎖呢?我們知道死鎖是循環(huán)爭奪資源而產(chǎn)生的。線程池中的線程也是資源的一種,那么如果對線程池中的線程進(jìn)行爭奪的話也是可能產(chǎn)生死鎖的。
在單個(gè)線程的線程池中,如果一個(gè)正在執(zhí)行的線程中,使用該線程池再去提交第二個(gè)任務(wù),因?yàn)榫€程池中的線程只有一個(gè),那么第二個(gè)任務(wù)將會等待第一個(gè)任務(wù)的執(zhí)行完成來釋放線程,而第一個(gè)任務(wù)又在等待第二任務(wù)的執(zhí)行來完成任務(wù)。從而產(chǎn)生了線程饑餓死鎖(Thread Starvation Deadlock).
線程饑餓死鎖并不一定在單個(gè)線程的線程池中產(chǎn)生,只要有這種循環(huán)使用線程池的情況都可能產(chǎn)生這種問題。
我們看下例子:
public class ThreadPoolDeadlock {ExecutorService executorService= Executors.newSingleThreadExecutor();public class RenderPageTask implements Callable<String> {public String call() throws Exception{Future<String> header, footer;header= executorService.submit(()->{return "header";});footer= executorService.submit(()->{return "footer";});return header.get()+ footer.get();}}public void submitTask(){executorService.submit(new RenderPageTask());} }我們在executorService中提交了一個(gè)RenderPageTask,而RenderPageTask又提交了兩個(gè)task。因?yàn)镋xecutorService線程池只有一個(gè)線程,則會產(chǎn)生死鎖。
我們的線程被餓死了!
本文的例子請參考https://github.com/ddean2009/learn-java-concurrency/tree/master/ThreadPoolDeadlock
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
更多內(nèi)容請?jiān)L問 flydean的博客
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的万万没想到,线程居然被饿死了!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ExecutorService来停止
- 下一篇: java中有界队列的饱和策略(rejec