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方法一定要再最后(先做容易题,后做难题)。