線程池思想概述java
當咱們要使用線程的時候就去建立一個線程時,雖然實現方便,可是會出現問題:若是併發的線程數量不少,而且每一個線程都是執行一個時間很短的任務就結束了,這樣頻繁建立線程就會大大下降系統的效率,由於頻繁建立線程和銷燬線程須要時間。服務器
線程池的概念併發
線程池:其實就是一個容納多個線程的容器,其中的線程能夠反覆使用,省去了頻繁建立線程對象的操做, 無需反覆建立線程而消耗過多資源。ide
/工具
合理利用線程池可以帶來三個好處:spa
1. 下降資源消耗。減小了建立和銷燬線程的次數,每一個工做線程均可以被重複利用,可執行多個任務。線程
2. 提升響應速度。當任務到達時,任務能夠不須要的等到線程建立就能當即執行。code
3. 提升線程的可管理性。能夠根據系統的承受能力,調整線程池中工做線線程的數目,防止由於消耗過多的內存,而把服務器累趴下(每一個線程須要大約1MB內存,線程開的越多,消耗的內存也就越大,最後死機)。對象
線程池的使用blog
Java裏面線程池的頂級接口是 java.util.concurrent.Executor ,可是嚴格意義上講 Executor 並非一個線程池,而只是一個執行線程的工具。真正的線程池接口是 java.util.concurrent.ExecutorService
Executors類中有個建立線程池的方法以下:
public static ExecutorService newFixedThreadPool(int nThreads) :返回線程池對象。(建立的是有界線程池,也就是池中的線程個數能夠指定最大數量)
獲取到了一個線程池ExecutorService 對象,
使用線程池對象的方法以下:
public Future<?> submit(Runnable task) :獲取線程池中的某一個線程對象,並執行。Future接口:用來記錄線程任務執行完畢後產生的結果。線程池建立與使用。
使用線程池中線程對象的步驟:
1. 建立線程池對象。
2. 建立Runnable接口子類對象。(task)
3. 提交Runnable接口子類對象。(take task)
4. 關閉線程池(通常不作)。
1 package demosummary.threadpool; 2 3 public class MyRunnable implements Runnable{ 4 @Override 5 public void run() { 6 System.out.println("你好,我想要找某某老師教我Java"); 7 try { 8 Thread.sleep(5000);//等待五秒後,等老師過來 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 System.out.println("老師過來了~" + Thread.currentThread().getName()); 13 System.out.println("今天老師教我了一些基礎Java,而後讓我回去多練習"); 14 } 15 }
1 package demosummary.threadpool; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 public class ThreadPoolTest { 7 public static void main(String[] args) { 8 //先建立一個線程池對象 9 ExecutorService service = Executors.newFixedThreadPool(5); 10 //建立Runnable實例對象 11 MyRunnable mr = new MyRunnable(); 12 13 /** 14 * 本身建立線程對象的方式 15 * Thread t = new Thread(r); 16 * t.start(); ‐‐‐> 調用MyRunnable中的run() 17 */ 18 //從線程池中獲取線程對象,而後調用MyRunnable中的run方法 19 service.submit(mr); 20 //再次從線程池中獲取線程對象,而後調用其run方法 21 service.submit(mr); 22 service.submit(mr); 23 // 注意:submit方法調用結束後,程序並不終止,而是把線程歸還到線程池中(相似共享充電寶),是由於線程池控制了線程的關閉。 24 // 將使用完的線程又歸還到了線程池中 25 // service.shutdown(); // 關閉線程池(通常推薦不關閉) 26 } 27 }