建立一個大小固定的線程執行者
當你使用由executors類的 newcachedthreadpool()方法建立的基本threadpoolexecutor,你會有執行者運作在某一時刻的線程數的問題。這個執行者為每個接收到的任務建立一個線程(如果池中沒有空閑的線程),是以,如果你送出大量的任務,并且它們有很長的(執行)時間,你會使系統過載和引發應用程式性能不佳的問題。
如果你想要避免這個問題,executors類提供一個方法來建立大小固定的線程執行者。這個執行者有最大線程數。 如果你送出超過這個最大線程數的任務,這個執行者将不會建立額外的線程,并且剩下的任務将會阻塞,直到執行者有空閑線程。這種行為,保證執行者不會引發應用程式性能不佳的問題。
在這個指南中,你将繼續學習怎樣建立一個大小固定的線程執行者,然後修改本章第一個示例的實作。
準備工作…
這個指南的例子使用eclipse ide實作。如果你使用eclipse或其他ide,如netbeans,打開它并建立一個新的java項目。
如何做…
按以下步驟來實作的這個例子:
1.實作本章第一個指南描述的示例,打開server類,修改它的構造器。使用newfixedthreadpool()方法建立執行者并傳入5作為參數。
<code>1</code>
<code>public</code> <code>server(){</code>
<code>2</code>
<code>executor=(threadpoolexecutor)executors.newfixedthreadpool(</code><code>5</code><code>);</code>
<code>3</code>
<code>}</code>
2.修改executetask()方法,包含額外的日志資訊行。調用gettaskcount()方法,擷取已經送出給執行者的任務數。
<code>system.out.printf(&quot;server: task count: %d\n&quot;,executor.</code>
<code>gettaskcount());</code>
它是如何工作的…
在本例中,你已經使用executors類的newfixedthreadpool()方法來建立執行者。這個方法建立一個有最大線程數的執行者。如果你送出超過最大線程數的任務,剩下的任務将會被阻塞,直到有空閑的線程來處理它們。這個方法接收一個你想要讓執行者擁有最大線程數的參數。在你的例子中,你已經建立了擁有5個線程的執行者。
以下截圖展示了執行這個示例輸出的一部分:

寫入的程式輸出到控制台,你已經使用了threadpoolexecutor類的一些方法,包括:
getpoolsize():此方法傳回線程池實際的線程數。
getactivecount():此方法傳回在執行者中正在執行任務的線程數。
你可以看出這些方法的輸出是5,表明執行者有5個線程。它本沒有超出既定的最大線程數。
當你送出最後的任務給執行者,它隻有5個活動的線程。剩下的95個任務将等待空閑線程。我們使用gettaskcount()方法來顯示有多少個任務已經送出給執行者。
不止這些…
executors類同時提供newsinglethreadexecutor()方法。這是大小固定的線程執行者的一個極端例子。它建立隻有一個線程的執行者,是以它在任意時刻隻能執行一個任務。
參見
在第4章,線程執行者中的建立線程執行者指南
在第8章,測試并發應用程式中的監控executor framework指南