Java幾種執行緒池及任務佇列

Charzzzzlie發表於2020-10-01

Java幾種執行緒池及任務佇列

JDK提供了一套Executor框架,該框架提供了多種型別的執行緒池,主要的有一下工廠方法:

//該方法返回一個固定執行緒數量的執行緒池。該執行緒池中的執行緒數量始終不變。
public static ExecutorService newFixedThreadPool(int nThreads)
//該方法返回一個只有一個執行緒的執行緒池。
public static ExecutorService newSingleThreadExecutor()
//該方法返回一個可根據實際情況調整執行緒數量的執行緒池。若所有執行緒均在工作,
//又有新任務提交,則會建立新的執行緒處理任務。
public static ExecutorService newCachedThreadPool()

//ScheduledExecutorService介面在ExecutorService介面上
//擴充套件了在給定時間執行某任務的功能。
public static ScheduledExecutorService newSingleThreadScheduleExecutor()
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

ScheduledExecutorService主要的方法如下:

//該方法會在給定的時間,對任務進行一次排程。下面兩個方法則是會週期性排程。
public ScheduledFuture<?> schedule(Runnable command,
											  long delay,
											  TimeUnit unit);

//該方法是在上個任務開始執行時為起點在period時間後排程下一次任務。
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                              long initialDelay,
                                              long period,
                                              TimeUnit unit);

//該方法是在上個任務結束後,再經過delay時間進行任務排程。
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                 long initialDelay,
                                                 long delay,
                                                 TimeUnit unit);

核心執行緒池的內部實現

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

從上面程式碼可知,這三種執行緒池都只是對ThreadPoolExecutor類的封裝。ThreadPoolExecutor類的建構函式如下:

public ThreadPoolExecutor(int corePoolSize,		//指定了執行緒池中的執行緒數量
                              int maximumPoolSize,	//指定了執行緒池中的最大執行緒數量
                              long keepAliveTime,	//當執行緒池執行緒數兩超過corePoolSize時,多餘的空閒執行緒的存活時間
                              TimeUnit unit,	//keepAliveTime單位
                              BlockingQueue<Runnable> workQueue,	//任務佇列
                              ThreadFactory threadFactory,	//執行緒工廠
                              RejectedExecutionHandler handler)	//拒絕策略

相關文章