1. 程式人生 > >Java基礎之執行緒池

Java基礎之執行緒池

一、執行緒池概念

執行緒池:其實就是一個容納多個執行緒的容器,其中的執行緒可以反覆使用,省去了頻繁建立執行緒物件的操作,無需反覆建立執行緒而消耗過多資源。

二、工作原理

這裡寫圖片描述

三、合理利用執行緒池的好處

  1. 降低資源消耗。減少了建立和銷燬執行緒的次數,每個工作執行緒都可以被重複利用,可執行多個任務。
  2. 提高響應速度。當任務到達時,任務可以不需要的等到執行緒建立就能立即執行。
  3. 提高執行緒的可管理性。可以根據系統的承受能力,調整執行緒池中工作線執行緒的數目,防止因為消耗過多的記憶體,而把伺服器累趴下(執行緒開的越多,消耗的記憶體也就越大,最後宕機)。

四、執行緒池的使用

Java裡面執行緒池的頂級介面是 java.util.concurrent.Executor ,但是嚴格意義上講 Executor 並不是一個執行緒
池,而只是一個執行執行緒的工具。真正的執行緒池介面是 java.util.concurrent.ExecutorService 。
要配置一個執行緒池是比較複雜的,尤其是對於執行緒池的原理不是很清楚的情況下,很有可能配置的執行緒池不是較優的,因此在 java.util.concurrent.Executors 執行緒工廠類裡面提供了一些靜態工廠,生成一些常用的執行緒池。官方建議使用Executors工程類來建立執行緒池物件。Executors類中有個建立執行緒池的方法如下:

public static ExecutorService newFixedThreadPool(int nThreads) :返回執行緒池物件。(建立的是有界線
程池,也就是池中的執行緒個數可以指定最大數量)

獲取到了一個執行緒池ExecutorService 物件,那麼怎麼使用呢,在這裡定義了一個使用執行緒池物件的方法如下:

public Future<?> submit(Runnable task) :獲取執行緒池中的某一個執行緒物件,並執行
Future介面:用來記錄執行緒任務執行完畢後產生的結果。執行緒池建立與使用。

五、使用執行緒池中執行緒物件的步驟

  1. 建立執行緒池物件。
  2. 建立Runnable介面子類物件。(task)
  3. 提交Runnable介面子類物件。(take task)
  4. 關閉執行緒池(可選)。
    Runnable實現類程式碼:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("我要一個教練");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("教練來了: " + Thread.currentThread().getName());
System.out.println("教我游泳,交完後,教練回到了游泳池");
}
}

執行緒池測試類:

public class ThreadPoolDemo {
public static void main(String[] args) {
// 建立執行緒池物件
ExecutorService service = Executors.newFixedThreadPool(2);//包含2個執行緒物件
// 建立Runnable例項物件
MyRunnable r = new MyRunnable();
//自己建立執行緒物件的方式
// Thread t = new Thread(r);
// t.start(); ‐‐‐> 呼叫MyRunnable中的run()
// 從執行緒池中獲取執行緒物件,然後呼叫MyRunnable中的run()
service.submit(r);
// 再獲取個執行緒物件,呼叫MyRunnable中的run()
service.submit(r);
service.submit(r);
// 注意:submit方法呼叫結束後,程式並不終止,是因為執行緒池控制了執行緒的關閉。
// 將使用完的執行緒又歸還到了執行緒池中
// 關閉執行緒池
//service.shutdown();
}
}

:執行緒分為兩大類,分別為:
1. 使用者執行緒(主要):只要沒結束,程式就不會退出。
2. 守護執行緒(次要):如果所有的使用者執行緒都結束了,那麼我也會結束。

tips
1. 執行緒池預設建立的是使用者執行緒,所以不會自己停止,如果希望關閉它,需要自己呼叫方法shutdown()
2. shutdownNow():立即關閉所有執行緒,不管執行完還是沒執行完。不建議平常使用。