探祕高併發之java.util.concurrent (二)

本系列關於concurrent的代碼示例,是被我分割成了小部分,在系列文章結束之後,我會將較爲完整的代碼上傳,在寫的過程當中我會參考官方API以及其餘牛人的看法,你們有不一樣的見解能夠在下面回覆。java

這一篇咱們繼續講concurrent包下面的接口,本篇講CallableAsynchronousCompletionTaskCompletionServiceCompletionService;其實這四個接口內容不算多就是概念型的,固然他們並非用不到的。web

1. Callable

實現Callable接口的類其實就是一個能夠返回結果的任務,而且能夠拋出異常。 經過ExecutorService.submit 方法提交一個callable任務,而且經過Future對象來得到結果。 Future對象能夠取消運行任務,設置等待時間,獲取任務狀態,最終得到任務結果。Callable相似於 Runnable,可是runnable並不會有返回結果和異常信息。這一點咱們須要區別開。dom

2. AsynchronousCompletionTask

一個標記接口識別異步任務的異步方法。他能夠提供監控,調試和跟蹤異步活動。異步

3. CompletionService

ExecutorService的擴展,能夠得到線程執行結果。
代碼示例:工具

import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestCompletionService {
    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        ExecutorService exec = Executors.newFixedThreadPool(10);
        CompletionService serv = new ExecutorCompletionService(exec);
        for (int index = 0; index < 5; index++) {
            final int NO = index;
            Callable downImg = new Callable() {
                public String call() throws Exception {
                    Thread.sleep((long) (Math.random() * 10000));
                    return "Downloaded Image " + NO;
                }
            };
            serv.submit(downImg);
        }
        Thread.sleep(1000 * 2);
        System.out.println("Show web content");
        for (int index = 0; index < 5; index++) {
            Future task = serv.take();
            String img = (String)task.get();
            System.out.println(img);
        }
        System.out.println("End");
        // 關閉線程池
        exec.shutdown();
     }
 }

4. CompletionStage

異步計算中可能出現的一個階段,也就是說當一個CompletionStage 完成時執行的動做或計算。
其實拆開來看就是,一個階段的執行可能會觸發完成一個單一的階段,或兩個階段,或多個階段。在一個階段的依賴關係被安排使用的方法與前綴。由兩個階段完成所觸發的,能夠結合他們的結果或效果,使用相應命名的方法。由兩個階段所觸發的,沒有保證的結果用於依賴階段的計算。這個類呢能夠說讓人很難取捨到底何時用,何時須要作幾個階段的處理計算。這個其實根據你們的業務考慮使用與否,畢竟他只是一個工具,即便有相同業務也可使用別的方式實現。線程

相關文章
相關標籤/搜索