newFixedThreadPool 建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。html
線程池的做用:java
線程池做用就是限制系統中執行線程的數量。
根 據系統的環境狀況,能夠自動或手動設置線程數量,達到運行的最佳效果;少了浪費了系統資源,多了形成系統擁擠效率不高。用線程池控制線程數量,其餘線程排 隊等候。一個任務執行完畢,再從隊列的中取最前面的任務開始執行。若隊列中沒有等待進程,線程池的這一資源處於等待。當一個新任務須要運行時,若是線程池 中有等待的工做線程,就能夠開始運行了;不然進入等待隊列。服務器
爲何要用線程池:併發
1.減小了建立和銷燬線程的次數,每一個工做線程均可以被重複利用,可執行多個任務。app
2.能夠根據系統的承受能力,調整線程池中工做線線程的數目,防止由於消耗過多的內存,而把服務器累趴下(每一個線程須要大約1MB內存,線程開的越多,消耗的內存也就越大,最後死機)。ide
測試代碼測試
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 http://www.javashuo.com/article/p-raxncszd-bo.htmlui