创建作业队列或任务控制器,并在Java中动态添加任务
嗨,我只想创建一个作业队列来执行多个任务。但是,我的要求是我应该能够随时将任务添加到该作业队列中,并且所有这些任务都应该按顺序执行。我在网上搜索了一些解决方案,找到了这两个链接1)2)。但我不能同时使用这两种解决方案,因为启动Executor服务后,我无法向该服务添加新任务。因为我们知道它可能会引发InterruptedException或ConcurrentModificationException。您可以使用创建作业队列或任务控制器,并在Java中动态添加任务,java,multithreading,executorservice,Java,Multithreading,Executorservice,嗨,我只想创建一个作业队列来执行多个任务。但是,我的要求是我应该能够随时将任务添加到该作业队列中,并且所有这些任务都应该按顺序执行。我在网上搜索了一些解决方案,找到了这两个链接1)2)。但我不能同时使用这两种解决方案,因为启动Executor服务后,我无法向该服务添加新任务。因为我们知道它可能会引发InterruptedException或ConcurrentModificationException。您可以使用阻塞队列在单独的线程中保持等待,直到出现一个或多个可运行 public class
阻塞队列
在单独的线程中保持等待,直到出现一个或多个可运行
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并在后台线程中不断删除和执行吗?你能给出一些示例链接吗这是我实际上需要的:)很高兴能帮上忙。这正是我真正需要的……)很高兴这有帮助。