创建作业队列或任务控制器,并在Java中动态添加任务

创建作业队列或任务控制器,并在Java中动态添加任务,java,multithreading,executorservice,Java,Multithreading,Executorservice,嗨,我只想创建一个作业队列来执行多个任务。但是,我的要求是我应该能够随时将任务添加到该作业队列中,并且所有这些任务都应该按顺序执行。我在网上搜索了一些解决方案,找到了这两个链接1)2)。但我不能同时使用这两种解决方案,因为启动Executor服务后,我无法向该服务添加新任务。因为我们知道它可能会引发InterruptedException或ConcurrentModificationException。您可以使用阻塞队列在单独的线程中保持等待,直到出现一个或多个可运行 public class

嗨,我只想创建一个作业队列来执行多个任务。但是,我的要求是我应该能够随时将任务添加到该作业队列中,并且所有这些任务都应该按顺序执行。我在网上搜索了一些解决方案,找到了这两个链接1)2)。但我不能同时使用这两种解决方案,因为启动Executor服务后,我无法向该服务添加新任务。因为我们知道它可能会引发InterruptedException或ConcurrentModificationException。

您可以使用
阻塞队列
在单独的线程中保持等待,直到出现一个或多个
可运行

public class Mainer {
    private static final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(15);

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    queue.take().run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });
        t.start();

        for (int i = 0; i < 10; i++) {
            queue.add(() -> {
                System.out.println("Hello");
            });
        }
    }

}
公共类维护器{
私有静态最终阻塞队列=新的ArrayBlockingQueue(15);
公共静态void main(字符串[]args){
线程t=新线程(()->{
while(true){
试一试{
queue.take().run();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
});
t、 start();
对于(int i=0;i<10;i++){
队列。添加(()->{
System.out.println(“你好”);
});
}
}
}

您可以使用
阻塞队列
在单独的线程中保持等待,直到出现一个或多个
可运行

public class Mainer {
    private static final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(15);

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    queue.take().run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });
        t.start();

        for (int i = 0; i < 10; i++) {
            queue.add(() -> {
                System.out.println("Hello");
            });
        }
    }

}
公共类维护器{
私有静态最终阻塞队列=新的ArrayBlockingQueue(15);
公共静态void main(字符串[]args){
线程t=新线程(()->{
while(true){
试一试{
queue.take().run();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
});
t、 start();
对于(int i=0;i<10;i++){
队列。添加(()->{
System.out.println(“你好”);
});
}
}
}

我认为您应该使用
执行器服务

  • 它维护要运行的任务队列。如果需要,您可以提供自己的队列
  • 可以随时使用
    submit
    方法添加新任务
  • 提交任务时可以获得未来
  • 任务可以一次运行一个,也可以使用工作线程池并行运行
  • 如果使用多个线程,则不同的executor服务实现提供不同的池管理策略
  • 存在用于排空和关闭服务的操作
请给出一些示例链接


这些示例都有。

我认为您应该使用
执行器服务

  • 它维护要运行的任务队列。如果需要,您可以提供自己的队列
  • 可以随时使用
    submit
    方法添加新任务
  • 提交任务时可以获得未来
  • 任务可以一次运行一个,也可以使用工作线程池并行运行
  • 如果使用多个线程,则不同的executor服务实现提供不同的池管理策略
  • 存在用于排空和关闭服务的操作
请给出一些示例链接


他们有一些例子。

使用
BlockingQueue
来保存runnables并在后台线程中不断删除和执行?你能给出一些示例链接吗?使用
BlockingQueue来保存runnables并在后台线程中不断删除和执行吗?你能给出一些示例链接吗这是我实际上需要的:)很高兴能帮上忙。这正是我真正需要的……)很高兴这有帮助。