線程池思想概述 當我們要使用線程的時候就去創建一個線程時,雖然實現方便,但是會出現問題:如果併發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。 線程池的概念 線程池:其實就是一個容納多個線程的容器,其中的線 ...
線程池思想概述
當我們要使用線程的時候就去創建一個線程時,雖然實現方便,但是會出現問題:如果併發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。
線程池的概念
線程池:其實就是一個容納多個線程的容器,其中的線程可以反覆使用,省去了頻繁創建線程對象的操作, 無需反覆創建線程而消耗過多資源。
/
合理利用線程池能夠帶來三個好處:
1. 降低資源消耗。減少了創建和銷毀線程的次數,每個工作線程都可以被重覆利用,可執行多個任務。
2. 提高響應速度。當任務到達時,任務可以不需要的等到線程創建就能立即執行。
3. 提高線程的可管理性。可以根據系統的承受能力,調整線程池中工作線線程的數目,防止因為消耗過多的記憶體,而把伺服器累趴下(每個線程需要大約1MB記憶體,線程開的越多,消耗的記憶體也就越大,最後死機)。
線程池的使用
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 }