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方法放在程序的最後一行,不影響其他代碼的操作