1. 程式人生 > >Java多執行緒-55-ExecutorService執行緒池

Java多執行緒-55-ExecutorService執行緒池

前面介紹了執行緒組,其實還有比執行緒組更大的管理執行緒的單元,叫執行緒池。字面意思就是一個池子裡,放著很多執行緒,就叫執行緒池。現在我們手機APP訪問任何的伺服器,伺服器上都是採用執行緒池來管理執行緒。我們知道,在記憶體中新建執行緒是需要耗費記憶體,如果沒有執行緒池,很多執行緒隨著使用者訪問而建立,隨著使用者離開伺服器而消失,那麼這個代價會很大,伺服器這麼點記憶體完全不夠用來建立支援成千上萬的使用者訪問。

1.執行緒池的概述

程式啟動一個新執行緒成本是比較高的,因為它涉及到要與作業系統進行互動。而使用執行緒池可以很好提高效能,尤其是當執行緒中藥建立大量生存週期很短
的執行緒時,更應該考慮使用執行緒池。執行緒池裡的每一個執行緒程式碼結束後,並不會死亡,而是再次回到執行緒池中成為空閒狀態,等待下一個物件來使用。在
JDK5之前,我們必須手動實現自己的執行緒池,之後版本,Java內建支援執行緒池。

2.內建執行緒池的使用
JDK5新增了一個Executors工廠類產生執行緒池,如下面幾個方法
- public static ExecutorService newFixedThreadPool(int nThreads)
- public static ExecutorService newSingleThreadExecutor()

這些方法的返回值是ExecutorService物件,該物件表示一個執行緒池,可以執行Runnable物件或者Callable物件代表的執行緒。它提供瞭如下方法:
- Future<?> submit(Runnable task)
- <T> Future<T> submit(Callable<T> task)

使用步驟:
- 建立執行緒池物件
- 建立Runnable例項
- 提交Runnable例項
- 關閉執行緒池

3.執行緒池的程式碼使用基本瞭解

package thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorService_Demo {

	public static void main(String[] args) {
		ExecutorService pool = Executors.newFixedThreadPool(3);
        pool.submit(new MyRunnable1());
        pool.submit(new MyRunnable1());
        pool.submit(new MyRunnable1());
        
        //pool.shutdown();
	}

}

class MyRunnable1 implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 1000; i++) {
			System.out.println(Thread.currentThread().getName() + "...." + i);
		}
	}
	
}

執行之後,如果不放開pool.shutdow()程式碼,程式不會自動終止執行。shutdown()方法就是用來關閉執行緒池的。