Java单线程任务队列实现
需求
需求介绍:需要在半双工环境下进行数据收发,即可以发送或接收信息,但不能同时进行这两个操作。
所以需要一个任务发送并接收数据后,下一个任务才能进行。由此需要单线程任务队列。
简介
使用Java实现单线程任务队列,并考虑优先级,即A任务执行时,此时以此加入优先级2的B任务和优先级1的C任务,则在A执行后会执行C再执行B。
流程
1. 建立队列实体类
队列基类,可根据需要继承此类的基础上再做修缮。
public abstract class BaseQueue implements Runnable{
/**
* 任务优先级 默认3
*/
private int priority;
public BaseQueue() {
this(3);
}
public BaseQueue(int priority) {
this.priority = priority;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
}
public class QueueIOTask extends BaseQueue {
/**
* 任务内容
*/
private Runnable task;
public QueueIOTask(Runnable task) {
this(task, 3);
}
public QueueIOTask(Runnable task, int priority) {
this.task = task;
super(priority);
}
@Override
public void run() {
task.run();
}
}
2. 建立队列工具类
public class MyQueue {
private ExecutorService executorService;
private BlockingQueue<BaseQueue> taskQueue;
private static MyQueue instance;
public static MyQueue getInstance() {
if(instance== null) {
synchronized (MyQueue.class) {
if (instance== null) {
instance= new MyQueue();
}
}
}
return controllerInstance;
}
private MyQueue() {
// 使用单线程的ExecutorService
executorService = Executors.newSingleThreadExecutor();
taskQueue = new PriorityBlockingQueue<>(10, Comparator.comparingInt(BaseQueue::getPriority));
// 启动任务执行线程
startExecution();
}
public void addTask(QueueIOTask queueIOTask) {
taskQueue.offer(queueIOTask);
}
public void startExecution() {
executorService.execute(() -> {
while (true) {
try {
// 取出队列中优先级最高的任务
Runnable task = taskQueue.take();
task.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
});
}
public void shutdown() {
if (executorService != null) {
executorService.shutdown();
}
}
}
3. 使用示例
//任务1
MyQueue.getInstance().addTask(new QueueIOTask(() -> {
//收发数据
}));
//任务2
MyQueue.getInstance().addTask(new QueueIOTask(() -> {
//收发数据
}));