newFixedThreadPool 建立一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。
線程池的作用:
線程池作用就是限制系統中執行線程的數量。
根 據系統的環境情況,可以自動或手動設定線程數量,達到運作的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其他線程排 隊等候。一個任務執行完畢,再從隊列的中取最前面的任務開始執行。若隊列中沒有等待程序,線程池的這一資源處于等待。當一個新任務需要運作時,如果線程池 中有等待的工作線程,就可以開始運作了;否則進入等待隊列。
為什麼要用線程池:
1.減少了建立和銷毀線程的次數,每個工作線程都可以被重複利用,可執行多個任務。
2.可以根據系統的承受能力,調整線程池中工作線線程的數目,防止因為消耗過多的記憶體,而把伺服器累趴下(每個線程需要大約1MB記憶體,線程開的越多,消耗的記憶體也就越大,最後當機)。
測試代碼
package com.ricoh.rapp.deploymenttool.ui.component;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountdownLatchTest1 {
public static void main(String[] args) {
try {
System.out.println("主線程" + Thread.currentThread().getName() + "等待子線程執行完成...");
ExecutorService service = Executors.newFixedThreadPool(3);
final CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 8; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.out.println("子線程" + Thread.currentThread().getName() + "開始執行" + new Date().getTime());
Thread.sleep(50000);
System.out.println("子線程" + Thread.currentThread().getName() + "執行完成" + new Date().getTime());
latch.countDown(); // 目前線程調用此方法,則計數減一
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
/*阻塞第一批次的任務,直到第一批次的每個線程都執行完畢才會執行下面的代碼;
* 第一批次如果有執行玩的會開始第二批次的任務,是以會存在第一二批次任務混合的情況
* */
latch.await(); // 阻塞目前線程,直到計時器的值為0
System.out.println("主線程" + Thread.currentThread().getName() + "開始執行...");
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* console:
* 主線程main等待子線程執行完成...
子線程pool-1-thread-2開始執行1558941022561
子線程pool-1-thread-1開始執行1558941022561
子線程pool-1-thread-3開始執行1558941022561
子線程pool-1-thread-3執行完成1558941072565
子線程pool-1-thread-2執行完成1558941072565
子線程pool-1-thread-3開始執行1558941072565
子線程pool-1-thread-1執行完成1558941072565
子線程pool-1-thread-2開始執行1558941072565
主線程main開始執行...
子線程pool-1-thread-1開始執行1558941072565
子線程pool-1-thread-3執行完成1558941122572
子線程pool-1-thread-1執行完成1558941122572
子線程pool-1-thread-1開始執行1558941122572
子線程pool-1-thread-2執行完成1558941122572
子線程pool-1-thread-3開始執行1558941122572
子線程pool-1-thread-3執行完成1558941172580
子線程pool-1-thread-1執行完成1558941172580*/
}
參考:https://www.cnblogs.com/zhujiabin/p/5404771.html https://www.cnblogs.com/tstd/p/4987935.html
轉載于:https://www.cnblogs.com/wang-liang-blogs/p/10931286.html