1、是否有返回值
2、是否需要泛型
3、是否拋異常
4、落地方法不一樣,一個是run,一個是call
//創建新類MyThread實現runnable接口
class MyThread implements Runnable{
@Override
public void run() {
}
}
//新類MyThread2實現callable接口
class MyThread2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return 200;
}
}
如果需要對10個線程,找到哪個線程出錯了,用runnable就無法實現,因爲沒有返回值。如果有callable接口,又出現了一個問題:thread構造方法根本沒有callable對象,只能傳進去一個runnable對象。怎麼辦呢?需要一個runnable對象去和callable對象建立聯繫,根據java的多態性(一個類可以實現多個接口)。
這個中間人就是FutureTask。
Runnable有一個子接口RunableFuture<V>
RunableFuture<V>有一個實現類FutureTask。
所以FutureTask實現了runnable接口。
package main.test;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* @Auther: wdq
* @Date: 2020/4/20 14:12
* @Description:
*/
class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("come in Mycallable");
return "Mycallable is Error";
}
}
public class Callable_futrue {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask futureTask = new FutureTask(new MyCallable());
new Thread(futureTask,"A").start();
System.out.println(futureTask.get());
}
}
get方法一定要再最後(先做容易題,後做難題)。