FutureTask類

FutureTask類是Future 的一個實現,並實現了Runnable, 所以可通過Executor(線程池)來執行,也可傳遞給Thread對象執行。
 如果在主線程中需要執行比較耗時的操作時,但又不想阻塞主線程時, 可以把這些作業交給Future對象在後臺完成,當主線程將來需要時, 就可以通過Future對象獲得後臺作業的計算結果或者執行狀態。 
Executor框架利用FutureTask來完成異步任務,並可以用來進行任何潛在的耗時的計算。
一般FutureTask多用於耗時的計算,主線程可以在完成自己的任務後,再去獲取結果。

/**
 * Created with IntelliJ IDEA.
 * User: 菜鳥大明
 * Date: 14-10-23
 * Time: 下午7:02
 * To change this template use File | Settings | File Templates.
 */
public class MyCallable1 implements Callable {
    @Override
    public Object call() throws Exception {
        System.out.println("call");
        return "end";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        MyCallable1 myCallable1 = new MyCallable1();

        FutureTask fk = new MyFutureTask(myCallable1);
        // 它可以通過Thread包裝來直接執行,
//        Thread thread = new Thread(fk);
//        thread.start();
        // 也可以提交給ExecuteService來執行,
//        ExecutorService exec = Executors.newCachedThreadPool();
//        Future<String> future = exec.submit(myCallable1);
        // 並且還可以通過v get()返回執行結果,
        // 在線程體沒有執行完成的時候,主線程一直阻塞等待,執行完則直接返回結果。
        fk.run();
        System.out.println(fk.get());
    }
}

class MyFutureTask extends FutureTask {

    public MyFutureTask(Callable callable) {
        super(callable);
    }

    // 當線程運行結束,則運行done方法。
    @Override
    public void done() {
        // 此處一般用來計算任務運行耗時解析。
        System.out.println("done");
    }
}


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