自定義線程池 demo (ThreadPoolExecutor)

以下的自定義線程池,使用了有界隊列,自定義的線程創建工廠和拒絕策略:

public class ThreadTest {
    public static void main(String[] args) throws IOException {
        int corePoolSize = 2;
        int maximumPoolSize = 4;
        long keepAliveTime = 10;
        TimeUnit unit = TimeUnit.SECONDS;
        // 有界隊列(等待最大線程數爲4)
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(4);
        // 自定義線程創建工廠
        ThreadFactory threadFactory = new MyThreadFactory();
        // 自定義拒絕策略
        RejectedExecutionHandler handler = new MyIgnorePolicy();
        // 自定義線程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,
                workQueue, threadFactory, handler);
        // 預啓動所有核心線程
        executor.prestartAllCoreThreads();

        for (int i = 1; i < 11; i++) {
            MyTask task = new MyTask(String.valueOf(i));
            executor.execute(task);
        }
        //阻塞主線程
        System.in.read(); 
    }
}

自定義線程創建工廠(MyThreadFactory):

public class MyThreadFactory  implements ThreadFactory {

    private final AtomicInteger mThreadNum = new AtomicInteger(1);

    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement());
        System.out.println(t.getName() + " has been created.");
        return t;
    }
}

自定義拒絕策略(MyIgnorePolicy):

public class MyIgnorePolicy implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        doLog(r, e);
    }

    private void doLog(Runnable r, ThreadPoolExecutor e) {
        // 做日誌記錄等
        System.err.println(r.toString() + " rejected");
    }
}

線程任務(MyTask):

public class MyTask implements Runnable {
    private String name;

    public MyTask(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(this.toString() + " is running!");
        try {
            //讓任務執行慢點
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyTask [name=" + name + ']';
    }
}

輸出結果如下:
在這裏插入圖片描述
運行結果可以看出,其中線程1、2、5、7先佔滿了核心線程和最大線程數量,然後線程3、4、6、8進入等待隊列,線程9、10直接被忽略拒絕執行,線程1、2、5、7中有線程執行完之後會通知線程3、4、6、8繼續執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章