Java併發之線程管理

    Java 1.5以後,Java平臺增加了java.util.concurrent包,這個包中包含了一個Executor Framework,這是一個基於接口的任務執行工具。使用這個工具可以很優雅的管理線程。 

   

public final class ThreadFactory
{
	/**
	 * 線程管理對象
	 */
	private static ExecutorService executor;
	
	/**
	 * 單例
	 */
	private static ThreadFactory instance = new ThreadFactory(3);
	
	private ThreadFactory(int num)
	{
		executor = Executors.newFixedThreadPool(num);
	}
	
	public static ThreadFactory getInstance()
	{
		return instance;
	}
	
	/**
	 * 執行線程,如果線程隊列都處於活動狀態,則等待
	 * @param run
	 */
	public void startThread(Runnable run)
	{
		executor.execute(run);
	}
	
	/**
	 * 停止線程,不再接受新任務
	 */
	public void stopThread()
	{
		executor.shutdown();
	}

}

    上面是一個線程工廠類,可以直接將需要執行的任務加入執行,非常方便。

   但是可能會有一些問題,如果有大量的線程需要執行,而線程隊列的數目又是一定的,

   這樣當隊列中有空閒時,新任務已經超時終止了,可能會拋異常或其他一些想不到的問題,

   這時該怎麼辦???要使用ThreadPoolExecutor嗎?

 

         Executors中定義了很多靜態方法,用於創建線程隊列:

    1. Executors.newCachedThreadPool():創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們。對於執行很多短期異步任務的程序而言,這些線程池通常可提高程序性能。調用execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持空閒的線程池不會使用任何資源。

    2. Executors.newFixedThreadPool(int nThreads):創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。在任意點,在大多數nThreads 線程會處於處理任務的活動狀態。如果在所有線程處於活動狀態時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執行期間由於失敗而導致任何線程終止,那麼一個新線程將代替它執行後續的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。

    3. Executors.newSingleThreadExecutor():創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因爲在關閉前的執行期間出現失敗而終止了此單個線程,那麼如果需要,一個新線程將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。

 

    上面的說明直接來自JDK1.6文檔。

    大量線程的創建和輪換非常消耗資源,因此可重用的線程池對於提高系統性能很有好處,更精細化的定製線程池可以使用ThreadPoolExecutor類。

    應該儘量避免編寫自己的線程隊列,而且應該儘量不直接使用線程。

    另外,ThreadGroup線程組也應該避免使用,這裏面的很多方法已經過時,有些也是線程不安全的。

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章