创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。
缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。
Callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做call():
这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。
那么如何使用Callable接口呢?
1.定义类实现Callable接口
2.重写call方法
3.开启线程
public class MyCall implements Callable<Integer> {
private int n;
public MyCall(int n){
this.n = n;
}
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += i;
}
return sum;
}
}
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCall myCall = new MyCall(100);
FutureTask<Integer> ft = new FutureTask<>(myCall);
// 需要注意Thread类并没有接收Callable接口的构造方法
//所以需要使用FutureTask包装一下 再传入到Thread类中
Thread t = new Thread(ft);
t.start();
System.out.println(ft.get());
}
}