天天看點

線程執行者(三)建立一個大小固定的線程執行者

建立一個大小固定的線程執行者

當你使用由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(&amp;quot;server: task count: %d\n&amp;quot;,executor.</code>

<code>gettaskcount());</code>

它是如何工作的…

在本例中,你已經使用executors類的newfixedthreadpool()方法來建立執行者。這個方法建立一個有最大線程數的執行者。如果你送出超過最大線程數的任務,剩下的任務将會被阻塞,直到有空閑的線程來處理它們。這個方法接收一個你想要讓執行者擁有最大線程數的參數。在你的例子中,你已經建立了擁有5個線程的執行者。

以下截圖展示了執行這個示例輸出的一部分:

線程執行者(三)建立一個大小固定的線程執行者

寫入的程式輸出到控制台,你已經使用了threadpoolexecutor類的一些方法,包括:

getpoolsize():此方法傳回線程池實際的線程數。

getactivecount():此方法傳回在執行者中正在執行任務的線程數。

你可以看出這些方法的輸出是5,表明執行者有5個線程。它本沒有超出既定的最大線程數。

當你送出最後的任務給執行者,它隻有5個活動的線程。剩下的95個任務将等待空閑線程。我們使用gettaskcount()方法來顯示有多少個任務已經送出給執行者。

不止這些…

executors類同時提供newsinglethreadexecutor()方法。這是大小固定的線程執行者的一個極端例子。它建立隻有一個線程的執行者,是以它在任意時刻隻能執行一個任務。

參見

在第4章,線程執行者中的建立線程執行者指南

在第8章,測試并發應用程式中的監控executor framework指南

繼續閱讀