線程池---Day26

線程池思想概述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 }
相關文章
相關標籤/搜索