JUC_ExecutorService詳解

概述

    在對數據庫操作時,有連接池的概念,比如:C3P0連接池、德魯伊連接池。而ExecutorService本質上是線程池。無論連接池也好,線程池也好,它們存在的主要意義就是減少頻繁創建和銷燬資源的頻率,達到提高資源的利用率的目地。
    可以將ExecutorService簡單稱作:執行器服務。

主要內容

核心線程隊列

    核心線程隊列是ExecutorService最主要的部分,對外提供核心線程,供調用者使用。核心線程使用完之後不會被銷燬,繼續等待下一個請求。

工作隊列

    當核心線程隊列已滿,並且都被佔用時,就將新的獲取線程的請求放到該隊列中等待。

臨時隊列

    當工作隊列也被塞滿時,將向外界提供臨時隊列的線程。臨時隊列用完時會銷燬,但不是立即銷燬,當隔一段時間沒有新的請求時再銷燬。

拒絕執行處理器

    有一種極端情況,就是核心線程隊列、工作隊列、臨時隊列都放滿時,如果再有新的請求,將由拒絕執行處理器負責處理。

代碼實現

package liwen.zhao;

import java.util.concurrent.*;


public class ExcutorServiceDemo {
    public static void main(String[] args) {
        //創建4個核心線程隊列、12-4=8個臨時線程隊列、臨時線程存活時間2秒、5個工作隊列、拒絕執行處理器(可選)
        ExecutorService executorService=new ThreadPoolExecutor(4, 12, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5), new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                System.out.println(r.toString()+"被拒絕了");
            }
        });
    
        for (int i=0;i<20;i++){
            executorService.execute(new MyThread());
        }
    }
}

class MyThread implements Runnable{
    
    @Override
    public void run() {
        System.out.println("線程執行了~");
    }
}

執行結果:

liwen.zhao.MyThread@29453f44被拒絕了
liwen.zhao.MyThread@5cad8086被拒絕了
liwen.zhao.MyThread@6e0be858被拒絕了
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章