開源一個基於Java ExecutorService的線程池包裝類ARTaskQueue

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章