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