ARTaskQueue
ARTaskQueue是一个基于Java ExecutorService的线程池包装类,对上层代码提供简单易用的接口方法,使上层代码聚焦业务而无需繁琐实现线程池的细节代码。Github地址:https://github.com/longjun3000/ARTaskQueue
ARTaskQueue现有的功能:
1、管理并发线程,可以1个线程串行,也可以自定义并发线程数;
2、可以添加任务,执行任意Callable任务,比如网络存取、数据库存取、复杂计算等等;
3、可以对某一任务执行取消、得到状态/执行结果;可以取消未执行的任务;可以手动控制队列开始/停止;
4、队列中所有任务完成后有回调,可以得到每个任务的执行状况以及返回值。
如何使用?
Android
// 实例化任务队列对象
final TaskQueue taskQueue = new TaskQueue();
// 设置并发线程数量
taskQueue.setMaxConcurrentThreadCount(4);
// 添加第1个任务
taskQueue.add("task1", new Callable<String>() {
String resultStr = null;
@Override
public String call() throws Exception {
System.out.println(">>> task1 start execute");
String resultStr = httpGet("http://www.baidu.com");
System.out.println(">>> task1 finished time: " + (new Date().toString()));
return resultStr;
}
});
// 添加第2个任务
taskQueue.add("task2", new Callable<String>() {
String resultStr = null;
@Override
public String call() throws Exception {
System.out.println(">>> task2 start execute");
try {
resultStr = httpGet("http://www.163.com");
}
catch (Exception e) {
// 如果任务2执行出错则取消后面的任务执行,队列将结束
taskQueue.cancelAllUnexecuted();
}
System.out.println(">>> task2 finished time: " + (new Date().toString()));
return resultStr;
}
});
// 添加第3个任务
taskQueue.add("task3", new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println(">>> task3 start execute");
System.out.println(">>> task3 finished time: " + (new Date().toString()));
return Integer.valueOf(1+1);
}
});
// 添加第4个任务
taskQueue.add("task4", new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println(">>> task4 start execute");
System.out.println(">>> task4 finished time: " + (new Date().toString()));
return Integer.valueOf(9*9);
}
});
// 设置整个队列完成后的回调
taskQueue.setQueueFinishedCallback(new TaskQueue.IQueueFinishedCallback() {
@Override
public void onFinished(Map<String, Object> result) {
System.out.println(">>> All task finished, total=" + result.size());
for (Map.Entry entry : result.entrySet()) {
// System.out.println(">>> TaskQueue finished, taskName=" + entry.getKey() + ", value=" + (entry.getValue()==null ? "null" : entry.getValue().toString()) );
System.out.println(">>> taskName=" + entry.getKey() + ", value=" + entry.getValue());
}
}
});
// 开始队列
taskQueue.start();
注:更多例子请参考源码工程下的单元测试例子“TaskQueueUnitTest.java” 或 “TaskQueueAppTest.java”。
ARTaskQueue Github地址:https://github.com/longjun3000/ARTaskQueue