java队列实现异步执行

发布网友 发布时间:2022-04-23 06:06

我来回答

2个回答

热心网友 时间:2023-08-01 05:24

在整个思路上要调整一下

1、会有很多线程给一个队列上添加任务

2、有一个或者多个线程逐个执行队列的任务


考虑一下几点:

1、没有任务时,队列执行线程处于等待状态

2、添加任务时,激活队列执行线程,全部run起来,首先抢到任务的执行,其他全部wait


给个小例子吧

package org;
import java.util.LinkedList;
import java.util.List;
public class Queues {
public static List<Task> queue = new LinkedList<Task>();
/**
 * 假如 参数o 为任务
 * @param o
 */
public static void add (Task t){
synchronized (Queues.queue) {
Queues.queue.add(t); //添加任务
Queues.queue.notifyAll();//激活该队列对应的执行线程,全部Run起来
}
}
static class Task{
public void test(){
System.out.println("我被执行了");
}
}
}

package org;
import java.util.List;
public class Exec implements Runnable{
@Override
public void run() {
while(true){
synchronized (Queues.queue) {
while(Queues.queue.isEmpty()){ //
try {
Queues.queue.wait(); //队列为空时,使线程处于等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("wait...");
}
Queues.Task t= Queues.queue.remove(0); //得到第一个
t.test(); //执行该任务
System.out.println("end");
}
}
}
public static void main(String[] args) {
Exec e = new Exec();
for (int i = 0; i < 2; i++) {
new Thread(e).start(); //开始执行时,队列为空,处于等待状态
}
//上面开启两个线程执行队列中的任务,那就是先到先得了
//添加一个任务测试
Queues.Task t =new Queues.Task();
Queues.add(t); //执行该方法,激活所有对应队列,那两个线程就会开始执行啦
}

}


上面的就是很简单的例子了

热心网友 时间:2023-08-01 05:24

你想问什么呢?判断队列是否有值?取队列中的值?
这两个问题你能完成的话还有啥需要解决呢?跟你以前的需求不一样么?追问我也不知道,以前没用过队列,看了下文档,然后写了这货,给组长看看,组长说不行,想请大神指导下异步写队列的规范。
还有,我再添加队列元素的时候需要调用下run那个方法,会不会对当前执行的run有影响。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com