1、先设置一个接口方便执行各种任务
// 任务
public interface ITask {
// 任务的方法
void run();
}
2、接下来创建一个执行任务的人
// 任务执行者 继承了Thread类
public class TaskExecutor extends Thread {
// 存放任务的阻塞队列
private BlockingQueue<ITask> taskQueue;
// 是否开启等待执行。
private boolean isRunning = true;
public TaskExecutor(BlockingQueue<ITask> taskQueue) {
this.taskQueue = taskQueue;
}
// 关闭执行
public void quit() {
isRunning = false;
//中断线程执行
interrupt();
}
@Override
public void run() {
while (isRunning) { // 开启任务是否执行。
ITask iTask;
try {
// 取出首个加入的任务,如果没有take会进行阻塞直到有新的对象加入为止
iTask = taskQueue.take();
} catch (InterruptedException e) {
if (!isRunning) {
// 发生意外了,是关闭状态吧线程关闭
interrupt();
break;
}
// 发生意外了,是开启任务状态返回继续等待
continue;
}
// 执行任务
iTask.run();
}
}
}
3、任务接口和执行者都有了封装队列来进行管理
//任务队列
public class TaskQueue {
// 任务队列
private BlockingQueue<ITask> mTaskQueue;
// 执行者
private TaskExecutor[] mTaskExecutors;
// new的时候指定执行者个数
public TaskQueue(int size) {
mTaskQueue = new LinkedBlockingQueue<>();
mTaskExecutors = new TaskExecutor[size];
}
// 开始执行线程
public void start() {
stop();
// 新建一个执行者去开启(start)线程执行(run)任务
for (int i = 0; i < mTaskExecutors.length; i++) {
mTaskExecutors[i] = new TaskExecutor(mTaskQueue);
mTaskExecutors[i].start();
}
}
// 停止全部线程和任务
public void stop() {
if (mTaskExecutors != null)
for (TaskExecutor taskExecutor : mTaskExecutors) {
if (taskExecutor != null) taskExecutor.quit();
}
}
// 添加一个任务
public <T extends ITask> int add(T task) {
if (!mTaskQueue.contains(task)) {
mTaskQueue.add(task);
}
// 返回排的队的人数,公开透明,让外面的人看的有多少人在等着办事。
return mTaskQueue.size();
}
}
3.1、在重写run的时候我这里想调用之前写好的一个方法结果出了BUG,@Autowired注解注入失败Class为null。这里原因可能是因为我们new了一个执行者去执行这个方法的时候这个对象脱离了spring的管理导致找不到。经过度娘找到手动注入的方法修改。
// 创建自己的任务实现类并继承任务类重写run方法
public class PrintTask implements ITask {
@Autowired
Class class;
private int id;
public PrintTask(int id) {
this.id = id;
}
@Override
public void run() {
try {
//调用add方法
class.add();
} catch (InterruptedException ignored) {
}
}
}
3.2、修改后方法
// 创建自己的任务实现类并继承任务类重写run方法
public class PrintTask implements ITask {
private int id;
public PrintTask(int id) {
this.id = id;
}
@Override
public void run() {
try {
//这里要注意不要放外面,因为加载顺序的原因会报错
Class class=GetBeanUtil.getBean(Class.class);
class.add();
} catch (InterruptedException ignored) {
}
}
}