java併發-走近Callable和Future

1.Callable

與Runnable類似,可以執行線程,與Runnable不同的是,它不是調用run方法,而是調用call方法,可以拋出異常,並且有返回值
在這裏插入圖片描述

public interface Callable<V> { 
    V call() throws Exception;
}

返回值和參數類型保持一致
我們搭建一個小的Demo來演示怎麼使用callable接口

public class callableTest {
    public static void main(String[] args) {
        //怎麼啓動callable?
    }
}
class MyThread  implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("執行了CALL方法");
        return 123;
    }
}

我們創建好了測試類,但是如何啓動該類,不能通過thread.start()方法來創建,因爲沒有run方法

2.FutureTask引入

在這裏插入圖片描述
FutureTask實現了Future和Runnable接口,這就說明可以通過new Thread(new Runnable()).start()的方式來啓動我們的callable線程了,也就是new Thread(new FutureTask(callable)).start(),就相當於一個適配類

public class callableTest {
    public static void main(String[] args) {
        //怎麼啓動callable?
        MyThread thread = new MyThread();
        FutureTask futureTask = new FutureTask(thread);
        new Thread(futureTask,"f").start();
    }
}
class MyThread  implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("執行了CALL方法");
        return 123;
    }
}

執行結果:

執行了CALL方法

我們可以把futureTask.get()假如到剛纔的代碼中就可以實現返回值的調用,注意,如果在call方法中有一些耗時的操作,那麼get方法會阻塞,所以我們最好的方式就是將get方法放在程序的最後一行,不影響其他代碼的操作

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