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()方法就是用來關閉執行緒池的。