当前位置: 首页 > 知识库问答 >
问题:

用blockingQueue Java触发SheduledExecutor

奚晟
2023-03-14

我目前正在研究java应用程序,它有一个场景,多个生产者将任务添加到队列中,每当队列不是空的时候,任务应该以预定义的速度执行。(使用多线程来保持执行速度)执行完可用的任务后,执行器必须等待队列中的任务再次可用。

我知道blockingQueue可以用来在这里触发part和ScheduledExecutorService以固定速率执行任务。但我找不到一种方法来联系这两者的能力,以满足我的需要。所以如果你能给我任何建议来实现这一点,我将非常感谢。

共有1个答案

桂高义
2023-03-14

您需要任务队列能够被生产者线程和使用者线程访问。我已经编写了一个基本程序来演示这一点,但我将让您根据需要使用blockingqueueAPI和scheduledexecutor:

import java.util.concurrent.*;


public class ProducerConsumer {
    private static final BlockingQueue<Integer> taskQueue = new LinkedBlockingQueue<>();

    public static void main(String[] args) {
        ExecutorService consumers = Executors.newFixedThreadPool(3);
        consumers.submit(new Consumer());
        consumers.submit(new Consumer());
        consumers.submit(new Consumer());

        ExecutorService producers = Executors.newFixedThreadPool(2);
        producers.submit(new Producer(1));
        producers.submit(new Producer(2));
    }

    private static class Producer implements Runnable {
        private final int task;

        Producer(int task) {
            this.task = task;
        }

        @Override
        public void run() {
            System.out.println("Adding task: " + task);
            taskQueue.add(task); // put is better, since it will block if queue is full
        }
    }

    private static class Consumer implements Runnable {
        @Override
        public void run() {
            try {
                Integer task = taskQueue.take(); // block if there is no task available
                System.out.println("Executing task: " + task);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
 类似资料:
  • 问题内容: 我的整个项目都使用(Bluebird)Promises,但是有一个使用EventEmitter的特定库。 我想要实现以下目标: 我在Promises链中读了EventEmitter的答案。这给了我一种执行’connect’事件的回调的方法。这是我到目前为止所到之处 现在如何进一步链接“ eventB”? 问题答案: 我假设您想为每个事件做不同的事情。即使由的动作触发,您也可以将其视为另

  • 本文向大家介绍触发器的作用?相关面试题,主要包含被问及触发器的作用?时的应答技巧和注意事项,需要的朋友参考一下 答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

  • Apex触发器类似于在特定事件发生时执行的存储过程。 在记录事件发生之前和之后执行触发器。 语法 (Syntax) trigger triggerName on ObjectName (trigger_events) { Trigger_code_block } 执行触发器 以下是我们可以触发的事件 - insert update delete merge upsert undelete 触发示

  • 本文向大家介绍MySQL触发器 Update触发Insert失败,包括了MySQL触发器 Update触发Insert失败的使用技巧和注意事项,需要的朋友参考一下 今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表 于是进行测试 执行触发器语句,报错,报错内容如下: 分析,由于访问工具HediSQL,导致无法正常创建触发器,相同语句,

  • 边缘触发是指每当状态变化时发生一个 io 事件,条件触发是只要满足条件就发生一个 io 事件

  • 问题内容: 我想知道是否有可能用JS触发CSS HOVER效果,而不必使用其他类… 我尝试使用触发效果,但这不会触发CSS悬停效果。 PS:我做了一个功能,可以帮助用户使用在线CMS。帮助功能通过在图像上四处移动来显示操作方法,以显示操作方法。虚拟光标可以单击内容,显示元素等。但是我希望该虚拟光标也可以触发CSS中设置的:hover效果。 问题答案: 我知道您要做什么,但为什么不简单地这样做: 该

  • 20.2.4 使用触发文件 如果您使用不断编译被修改文件的IDE,那么可能只希望在特定时刻触发重启。要做到这点,您可以使用“触发文件”,它是一个特殊的文件,当您实际想要实发重启检查时修改该文件。改动文件只会触发检查,只有当Devtools检测到必须执行某些操作时重启才会发生。触发文件可以手动更新,也可以通过IDE插件更新。 要使用触发文件,请使用spring.devtools.restart.tr