主要分为三块: 任务task,TaskExecutor任务执行器,TaskQueue任务队列。
下面详细讲解一下:
任务task的接口ITask:
public interface ITask { //执行方法 void run(); }
任务task的接口实现类:
public class ActionAppTask implements ITask { public ActionAppTask(){ //构造方法 } @Override public void run() { //todo:要执行的操作 }
}
TaskExecutor任务执行器:
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 { iTask = taskQueue.take(); // 下一个任务,没有就等着。 } catch (InterruptedException e) { if (!isRunning) { // 发生意外了,是退出状态的话就把窗口关闭。 interrupt(); break; // 如果执行到break,后面的代码就无效了。 } // 发生意外了,不是退出状态,那么窗口继续等待。 continue; } // 执行任务。 iTask.run(); } } }
TaskQueue任务队列:
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(); // 开启队列。 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(); } }
亲测非常好用,对于有线程返回值的异步任务处理,非常适合。