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是Java中的一个接口,它继承自Queue接口,并添加了一些阻塞操作。由于其特性,BlockingQueue在多线程编程中非常有用,以下是一些常见的使用场景:1...

  • BlockingQueue如何选择合适的实现

    在选择合适的BlockingQueue实现时,需要根据具体的需求和场景来进行选择。以下是一些常见的BlockingQueue实现及其适用场景: ArrayBlockingQueue:基于数组实现的...

  • BlockingQueue支持哪些操作

    BlockingQueue支持以下操作: put(E e):将元素插入到队列中,如果队列已满,则等待直到有空间可用。
    take():从队列中取出并移除头元素,如果队列为空,则...

  • 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),用于表示查询...