就是個裝Thread對象的容器,線程的建立和銷燬都是很耗費系統資源的事情,若是一個程序運行的代碼很簡單,可是涉及到屢次線程建立和銷燬,將會很浪費時間,浪費資源,因此線程池站了出來解決這個問題,線程池裏裝了若干線程對象(建立線程池時要咱們指定),當一個用戶須要執行線程任務時,從線程池拿一個對象分配任務,若是線程不夠用,任務對象會等待,當一個線程任務結束,並不會銷燬線程而是回答池子裏去,線程的建立和管理交給jvm,咱們須要作的事情就是指定咱們須要幾個線程,以及指定任務便可。java
ExecutorService es = Executors.newFixedThreadPool(3);web
2.指定任務,能夠定義Runnable接口實現類,能夠匿名內部類,能夠lambda表達式,總之將任務穿給第一步獲取到的提供代碼執行服務的對象,調用的方法是submitjvm
//匿名內部類 es.submit(new Runnable(){ ... }); //lambda es.submit(()->{...});
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolDemo { public static void main(String[] args) { // 1.獲取執行任務的服務對象 ExecutorService es = Executors.newFixedThreadPool(3); // 2.提交任務 es.submit(() -> { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "is hehe" + i); } }); for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " is haha..." + i); } es.submit(() -> { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "is hehe" + i); } }); for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " is haha..." + i); } es.submit(() -> { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "is hehe" + i); } }); for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " is haha..." + i); } } }