1. 線程池的介紹:
在開發中,頻繁的創建和銷燬一個線程,是很耗資源的,爲此找出了一個可以循環利用已經存在的線程來達到自己的目的,線程池顧名思義,也就是線程池的集合,通過線程池執行的線程任務,可以很有效的去規劃線程的使用。
在java.util.concurrent併發包中大致有以下幾種常用的線程池:
1.1 newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行。可以作一個定時器使用。
1.2 newCachedThreadPool 創建一個可緩存線程池,如果線程池長度超過需要的線程數量,可靈活回收空閒線程,若無可回收,則新建線程。
1.3 newSingleThreadExecutor 創建一個單線程化的線程池, 它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行,可以控制線程的執行順序
1.4 newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待,當創建的線程池數量爲1的時候。也類似於單線程化的線程池,當爲1的時候,也可控制線程的執行順序
public class ThreadPoolTest {
/**
* 測試newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行。
* 一般可做定時器使用
*/
public static void newScheduledThreadPoolTest(){
//corePoolSize 參數是指線程池中核心線程的數量
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
/**
* initialDelay參數,是首次執行該線程的延遲時間
* period參數,週期性執行業務邏輯的間隔時間
*/
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//執行業務邏輯
System.out.println(System.currentTimeMillis());
}
}, 10, 3, TimeUnit.SECONDS);
}
/**
* newCachedThreadPool創建一個可緩存線程池,
* 如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
*/
public static void newCachedThreadPoolTest(){
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int finalI = i;
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
//執行業務邏輯
System.out.println(finalI + ":" + System.currentTimeMillis());
}
});
}
}
/**
* newSingleThreadExecutor 創建一個單線程化的線程池,
* 它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行
*/
public static void newSingleThreadExecutorTest(){
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for(int i = 0; i < 10; i++){
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
//執行業務邏輯
System.out.println(index);
}
});
}
}
/**
* newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待
*/
public static void newFixedThreadPoolTest(){
//最多2個線程將處於活動狀態,如果提交了2個以上的線程,那麼它們將保持在隊列中,直到線程可用
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
for(int i = 0; i < 10; i++){
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
public static void main(String args[]){
// ThreadPoolTest.newScheduledThreadPoolTest();
// ThreadPoolTest.newCachedThreadPoolTest();
// ThreadPoolTest.newSingleThreadExecutorTest();
ThreadPoolTest.newFixedThreadPoolTest();
}
}