天天看點

Java多線程2.7.線程池1-ExecutorService對象-Runnable接口

線程池

1、線程池的概述

  • 程式啟動一個新線程成本是比較高的,因為它涉及到要與作業系統進行互動。而使用線程池可以很好的提高性能,尤其是當程式中要建立大量生存期很短的線程時,更應該考慮使用線程池。
  • 線程池裡的每一個線程代碼結束後,并不會死亡,而是再次回到線程池中成為空閑狀态,等待下一個對象來使用。
  • 在JDK5之前,我們必須手動實作自己的線程池。從JDK5開始,Java内置支援線程池。

2、JDK5中的線程池

  • JDK5新增了一個Executors工廠類來産生線程池,有如下幾個方法:
    • public static ExecutorService newCachedThreadPool()
    • 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執行個體
    • 關閉線程池
  • public static ExecutorService newCachedThreadPool()
    • 建立一個具有緩存功能的線程池。緩存:百度浏覽過的資訊再次通路
  • public static ExecutorService newFixedThreadPool(int nThreads)
    • 建立一個可重用的,具有固定線程數的線程池
  • public static ExecutorService newSingleThreadExecutor()
    • 建立一個隻有單線程的線程池,相當于上個方法的參數是1

3、線程池的案例示範

(1)建立一個實作Runnable接口的線程類

package cn.itcast_08;
public class MyRunnable implements Runnable {
	@Override
	public void run() {
		for (int x = 0; x < 100; x++) {
			System.out.println(Thread.currentThread().getName() + ":" + x);
		}
	}

}
           

(2)測試線程池

package cn.itcast_08;

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

/*
 * 線程池的好處:線程池裡的每一個線程代碼結束後,并不會死亡,而是再次回到線程池中成為空閑狀态,等待下一個對象來使用。
 * 
 * 如何實作線程的代碼呢?
 * 		A:建立一個線程池對象,控制要建立幾個線程對象。
 * 			public static ExecutorService newFixedThreadPool(int nThreads)
 * 		B:這種線程池的線程可以執行:
 * 			可以執行Runnable對象或者Callable對象代表的線程
 * 			做一個類實作Runnable接口。
 * 		C:調用如下方法即可
 * 			Future<?> submit(Runnable task)
 *			<T> Future<T> submit(Callable<T> task)
 *		D:我就要結束,可以嗎?
 *			可以。
 */
public class ExecutorsDemo {
	public static void main(String[] args) {
		// 建立一個線程池對象,控制要建立幾個線程對象。
		// public static ExecutorService newFixedThreadPool(int nThreads)
		ExecutorService pool = Executors.newFixedThreadPool(2);

		// 可以執行Runnable對象或者Callable對象代表的線程
		pool.submit(new MyRunnable());
		pool.submit(new MyRunnable());

		//結束線程池
		pool.shutdown();
	}
}
           

繼續閱讀