我們在構建線程池的時候可以構建單個線程的線程池和多個線程的線程池。
那麼線程池使用不當可不可能產生死鎖呢?我們知道死鎖是循環爭奪資源而產生的。線程池中的線程也是資源的一種,那麼如果對線程池中的線程進行爭奪的話也是可能產生死鎖的。
在單個線程的線程池中,如果一個正在執行的線程中,使用該線程池再去提交第二個任務,因為線程池中的線程只有一個,那麼第二個任務將會等待第一個任務的執行完成來釋放線程,而第一個任務又在等待第二任務的執行來完成任務。從而產生了線程飢餓死鎖(Thread Starvation Deadlock).
線程飢餓死鎖並不一定在單個線程的線程池中產生,只要有這種循環使用線程池的情況都可能產生這種問題。
我們看下例子:
<code>public
class
ThreadPoolDeadlock
{ ExecutorService executorService= Executors.newSingleThreadExecutor();public
class
RenderPageTask
implements
Callable
<String
> {public
Stringcall
()
throws
Exception{ Future header, footer; header= executorService.submit(()->{return
"header"
; }); footer= executorService.submit(()->{return
"footer"
; });return
header.get()+ footer.get(); } }public
void
submitTask
()
{ executorService.submit(new
RenderPageTask()); } } /<code>
Java
我們在executorService中提交了一個RenderPageTask,而RenderPageTask又提交了兩個task。因為ExecutorService線程池只有一個線程,則會產生死鎖。
我們的線程被餓死了!
更多內容請訪問:flydean的博客 flydean.com
關鍵字: RenderPageTask 線程 public