線程池
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();
}
}