117.info
人生若只如初见

blockingqueue的线程池实现

BlockingQueue 是 Java 并发编程中用于在生产者和消费者线程之间传递数据的一种阻塞队列。它可以用于实现线程池,以便在有限的线程资源下高效地处理任务。下面是一个简单的线程池实现,使用 BlockingQueue 作为任务队列:

import java.util.concurrent.*;

public class BlockingQueueThreadPool {
    private final int corePoolSize;
    private final BlockingQueue 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() 方法用于关闭线程池。在关闭线程池之前,所有已提交的任务都将被执行完毕。

未经允许不得转载 » 本文链接:https://www.117.info/ask/feb27AzsBAQNRBw.html

推荐文章

  • 如何选择合适的BlockingQueue实现类

    在选择合适的BlockingQueue实现类时,需要考虑多个因素,包括队列的容量、是否需要排序、性能要求以及应用场景等。以下是一些常见的BlockingQueue实现类及其适用...

  • BlockingQueue在并发编程中有哪些应用场景

    BlockingQueue 是 Java 并发编程库 java.util.concurrent 中的一个接口,它提供了一个线程安全的队列,可以用于在生产者和消费者线程之间传递数据。以下是 Block...

  • BlockingQueue与普通队列在性能上有何差异

    BlockingQueue与普通队列在性能上的主要差异在于阻塞操作、线程安全性和适用场景。下面我们将详细探讨这些差异:
    阻塞操作 BlockingQueue:当队列为空时,消...

  • 在使用BlockingQueue时,如何避免队列溢出

    在使用BlockingQueue时,为了避免队列溢出,可以采取以下策略: 选择合适的队列容量:在创建BlockingQueue时,根据实际需求设置一个合适的容量。这样可以确保队列...

  • nextval在触发器中的使用

    nextval 是一个 PostgreSQL 数据库函数,用于获取序列(sequence)的下一个值。在触发器(trigger)中使用 nextval 可以自动为表中的某个字段生成唯一的值,通常...

  • surfaceflinger的源码结构解析

    SurfaceFlinger 是 Android 图形系统的一部分,负责管理和合成屏幕上显示的图像 include 目录:包含 SurfaceFlinger 的头文件,这些头文件定义了 SurfaceFlinger...

  • 如何永久设置linux环境变量

    要在Linux中永久设置环境变量,您需要编辑用户或系统的shell配置文件 对于Bash shell(大多数Linux发行版的默认shell):
    a. 为当前用户设置环境变量:

  • rownum与rowid的区别是什么

    ROWNUM 和 ROWID 在数据库中都是用来唯一标识行的,但它们之间有一些关键区别: ROWNUM: ROWNUM 是 Oracle 数据库中的一个伪列(pseudo-column),用于表示查询...