中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

blockingqueue的線程池實現

小樊
82
2024-09-02 21:17:05
欄目: 編程語言

BlockingQueue 是 Java 并發編程中用于在生產者和消費者線程之間傳遞數據的一種阻塞隊列。它可以用于實現線程池,以便在有限的線程資源下高效地處理任務。下面是一個簡單的線程池實現,使用 BlockingQueue 作為任務隊列:

import java.util.concurrent.*;

public class BlockingQueueThreadPool {
    private final int corePoolSize;
    private final BlockingQueue<Runnable> taskQueue;
    private final ThreadPoolExecutor threadPoolExecutor;

    public BlockingQueueThreadPool(int corePoolSize, int maxPoolSize, int queueCapacity) {
        this.corePoolSize = corePoolSize;
        this.taskQueue = new LinkedBlockingQueue<>(queueCapacity);
        this.threadPoolExecutor = new ThreadPoolExecutor(
                corePoolSize,
                maxPoolSize,
                60L,
                TimeUnit.SECONDS,
                taskQueue
        );
    }

    public void submit(Runnable task) throws InterruptedException {
        if (threadPoolExecutor.getCorePoolSize()< corePoolSize) {
            synchronized (this) {
                if (threadPoolExecutor.getCorePoolSize()< corePoolSize) {
                    threadPoolExecutor.setCorePoolSize(corePoolSize);
                }
            }
        }
        threadPoolExecutor.execute(task);
    }

    public void shutdown() {
        threadPoolExecutor.shutdown();
    }

    public static void main(String[] args) throws InterruptedException {
        BlockingQueueThreadPool threadPool = new BlockingQueueThreadPool(2, 4, 10);

        for (int i = 0; i < 20; i++) {
            final int taskId = i;
            threadPool.submit(() -> {
                System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        threadPool.shutdown();
    }
}

在這個實現中,我們創建了一個名為 BlockingQueueThreadPool 的類,它包含一個核心線程池大小、一個最大線程池大小和一個任務隊列容量。我們使用 ThreadPoolExecutor 來管理線程池,并將 LinkedBlockingQueue 作為任務隊列。

submit() 方法用于向線程池提交任務。在提交任務之前,我們會檢查當前核心線程池的大小是否小于預期的核心線程池大小。如果是,則將核心線程池大小設置為預期值。這樣可以確保在任務提交時,線程池中始終有足夠的線程來處理任務。

shutdown() 方法用于關閉線程池。在關閉線程池之前,所有已提交的任務都將被執行完畢。

0
中牟县| 广宁县| 建瓯市| 建平县| 南召县| 定西市| 孝感市| 泌阳县| 崇明县| 松桃| 武汉市| 黎城县| 怀集县| 玉龙| 辽阳市| 伊川县| 安岳县| 新乐市| 新闻| 柳河县| 延安市| 仙居县| 南岸区| 七台河市| 沾化县| 龙口市| 济宁市| 大竹县| 海口市| 泰安市| 旌德县| 虹口区| 华宁县| 松滋市| 房山区| 正安县| 靖江市| 平凉市| 孝昌县| 丹凤县| 陈巴尔虎旗|