1.線程池的使用背景:
經常建立和銷毀線程,及使用量特别大的資源,比如并發情況下的線程,對計算機性能影響特别大,這時就需要一個能存儲這些經常使用的線程的東西,線程池因用而生
2.線程池的實作思路:
- 提前建立好多個線程,放入線程池中,使用時直接擷取,使用後放回池中
- 可以避免頻繁建立和銷毀線程,實作重複利用(類似生活中的公共交通工具,使用時借用一下,使用後放回規定地方,無需自己建立一個)
3.使用線程池的好處:
- 提高響應速度(減少了建立新線程的時間)
- 降低資源消耗(重複利用線程池中的線程)
- 便于線程管理:
- corePoolSize: 核心池的大小
- maximumPoolSize: 最大線程數
- keepAliveTime: 線程沒有任務時最多保持多長時間後會終止
4.線程池相關API
- JDK5.0起:
ExecutorService 和 Executors
①ExecutorService:
真正的線程池接口
常見子類 ThreadPoolExecutor
- void execute(Runnable command):
執行任務/指令,無傳回值,一般用來執行Runnable
- <T>Future<T>submit(callable<T>task):
執行任務,有傳回值,一般用來執行Callable
- void shutdown();
關閉連接配接池
②Executors:
工具類,線程池的工廠類,用來建立并傳回不同類型的線程池
- Executors,newCachedThreadPool();
//建立一個可根據需要建立新線程的線程池
- Executors,newFixedThreadPool():
//建立一個可重用固定線程數的線程池
- Executors.newSingleThreadExecutor();
//建立一個隻有一個線程的線程池
- Executors.newScheduledThreadPool():
//建立一個線程池,它可安排在給定延遲後運作指令或定期執行
eg:
package 線程池;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class NumberThread implements Runnable{
@Override
public void run() {
for (int i=0;i<=100;i++){
if (i%2==0){
System.out.println(i);
}
}
}
}
class NumberThread1 implements Runnable{
@Override
public void run() {
for (int i=0;i<=100;i++){
if (i%2!=0){
System.out.println(i);
}
}
}
}
public class Xiancehngchi {
public static void main(String[] args) {
//ExecutorService接口實作類的對象
//1.提供指定線程數量的線程池
ExecutorService service = Executors.newFixedThreadPool(10); //設定線程的數量為10
//2.執行指定的線程的操作,需要提供實作Runnable接口或Collable接口實作類的對象
service.execute(new NumberThread()); //執行,适合使用于Runnable
service.execute(new NumberThread1()); //建立第二個線程
//service.submit(Collable collable); //送出,适合使用于Collable
//3.關閉線程池
service.shutdown();
}
}