当前位置: 首页 > 面试题库 >

Java是否有可索引的多队列线程池?

拓拔骁
2023-03-14
问题内容

是否有这样的Java类:

  1. 可以通过ID添加可执行任务,其中保证所有具有相同ID的任务都不会同时运行
  2. 线程数可以限制为固定数量
    Map的幼稚解决方案很容易解决(1),但难以管理(2)。同样,我所知道的所有线程池类都将从单个队列中提取,这意味着不能保证(1)。

欢迎使用涉及外部库的解决方案。


问题答案:

如果找不到开箱即用的东西,那么推出自己的产品就不难了。您可以做的一件事是将每个任务包装在一个简单的类中,该类读取每个id唯一的队列,例如:

public static class SerialCaller<T> implements Callable<T> {
    private final BlockingQueue<Caller<T>> delegates;

    public SerialCaller(BLockingQueue<Caller<T>> delegates) {
        this.delegates = delegates;
    }

    public T call() throws Exception {
        return delegates.take().call();
    }
}

维护ID到队列以提交任务的映射应该很容易。满足条件(1),然后您可以寻找条件(2)的简单解决方案,例如Executors。newFixedThreadPool



 类似资料:
  • 问题内容: 在所有任务中,我有一些必须按顺序处理(它们永远不能同时运行,必须按顺序处理)。 我实现了为必须串行执行的每组任务创建一个具有单个线程的独立线程池的功能。它有效,但我没有足够的资源。我无法控制组的数量,因此最终可能会产生大量同时运行的线程。 有什么办法可以通过单个线程池完成此任务?是否有一个带有多个阻塞队列的线程池,我可以确保每个队列的串行执行? 编辑: 只是强调我在第二段中所说的:我已

  • 问题内容: 我正在使用的类创建用于运行Web服务器的请求处理程序的固定线程池: 并且说明是: 创建一个线程池,该线程池重用在共享的 无边界 队列上运行的一组固定线程。 但是,我正在寻找实现与缓冲池完全相同的线程池实现,除了使用有 界 队列。有这样的实现吗?还是我需要为固定线程池实现自己的包装器? 问题答案: 您想要做的是新建自己的ExecutorService,可能使用ThreadPoolExec

  • 如果队列已满,ArrayBlockingQueue将阻止生产者线程;如果队列为空,ArrayBlockingQueue将阻止消费者线程。 这种阻塞的概念是否与多线程的思想背道而驰?如果我有一个“主”线程,并假设我想将所有“日志记录”活动委托给另一个线程。因此,基本上在我的主线程内,我创建了一个Runnable来记录输出,并将其放在ArrayBlockingQueue上。这样做的全部目的是让“主”线

  • 我需要一个库或我们的软件工具,可以: 1)将线程/作业/任务(任何东西--如果需要,我们可以重写代码,我们在mintue有线程对象)放入像system这样的队列中2)我们可以定义同时最多运行多少线程3)线程完成后,线程从队列中移除,这样GC就可以移除所有涉及的实体。 我正在进行大量阅读,发现ExecutorService(Executors.newFixedThreadPool(5);)但问题可能

  • 我正计划创建可调整队列大小的可调整线程池。我正在使用unbounded LinkedBlockingQueue和一个外部设置,该设置控制排队的消息数量。最初,my corepoolsize和maxpoolsize是相等的。现在,如果我想在运行时更新我的线程池大小,我通过一个公共设置将corepoolsize和maxpoolsize设置为不同的值。我想知道你对这种做法有什么看法。 当maxpools

  • 我试图理解多个线程是否可以并发/并行来自Spring集成队列通道的消息。假设我有以下配置: 如果无法实现队列通道中消息的并发处理,建议采用什么方法