網頁

2021/1/12

Java ThreadPoolExecutor 建構式參數簡介 constructor arguments

本篇簡單說明多執行緒(多線程)任務執行器ThreadPoolExecutor的建構式參數。

ThreadPoolExecutorJava執行緒池(thread pool)的實作類別。

ThreadPoolExecutor建構式如下。

ThreadPoolExecutor(
    int corePoolSize, 
    int maximumPoolSize, 
    long keepAliveTime, 
    TimeUnit unit, 
    BlockingQueue<Runnable> workQueue, 
    ThreadFactory threadFactory, 
    RejectedExecutionHandler handler
)

  1. corePoolSize:核心執行緒數量,為池中保持的執行緒數量,即使沒有任務執行也仍會保持的執行緒數。不可小於0。

  2. maximumPoolSize:最大執行緒數量,為池中允許最大的執行緒數量,超過corePoolSize數的執行緒若閒置超過keepAliveTime設定的時間會被消滅。不可小於1,不可小於corePoolSize

  3. keepAliveTime:執行緒存活時間。超過corePoolSize數的執行緒可閒置時間,當超過時間則執行緒會被終結。不可小於0

  4. unit:時間單位,為keepAliveTime的時間單位。

  5. workQueue:任務隊列(BlockingQueue),用來儲存待執行任務的Queue。不可為null。

  6. threadFactory:執行緒工廠,用來建立ThreadPoolExecutor執行任務時需要的執行緒。不可為null。

  7. handler:拒絕處裡器。任務數量超過隊列上限無法被執行時的處理器。不可為null。


使用範例。

package com.abc.demo;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Main {

    public static void main(String[] args) {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                5, // corePoolSize
                10, // maximumPoolSize
                5L, // keepAliveTime
                TimeUnit.SECONDS, // unit
                new LinkedBlockingQueue<Runnable>(10), // workQueue
                Executors.defaultThreadFactory(), // threadFactory
                new ThreadPoolExecutor.AbortPolicy() // handler
        );

        executor.execute(new Runnable() {
            @Override
            public void run() {
                // task ...
            }
        });

        executor.shutdown();

    }

}

不過若無特殊需求一般用Executors.newFixedThreadPool(int nThreads)建立ExecutorService實例來使用即可。

package com.abc.demo;

import java.util.concurrent.*;

public class Main {

    public static void main(String[] args) {

        ExecutorService executor = Executors.newFixedThreadPool(10);

        executor.execute(new Runnable() {
            @Override
            public void run() {
                // task ...
            }
        });

        executor.shutdown();
        
    }

}

Executors.newFixedThreadPool(int nThreads)原始碼如下,相當於建立一個核心執行緒與最大執行緒相同的ThreadPoolExecutor

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


沒有留言:

張貼留言