Java要创建一个线程,可以继承自Thread类,或者实现Runable接口,但JUC还提供了另外一种方式,就是通过Callable+FutureTask创建并使用线程
1.FutureTask
Future是JDK提供的用于处理多线程环境下异步问题的一种模式,而FutureTask就是对Future模式的一种实现
Future模式的最大好处就是客户端在发出请求后,可以马上得到一个反馈结果,而不用一直等待着服务端来处理
在使用FutureTask时,get()方法就用于返回服务端真正处理后的真实值,由于服务端不一定马上能处理完毕,因此调用get()方法时候会出现一定时间阻塞,等待服务器处理完毕
2 .Callable
Callable和Runable类似,都是创建线程的上级接口,但也有所不同
- 使用Callable创建线程,需要重写call方法,使用Runable创建线程,需要重写run方法
- run方法没有返回值,call方法却有一个类型为泛型的返回值,而且可以通过FutureTask的get方法来接收次返回值
- get方法是一个闭锁式的阻塞方法,该方法会一直等待,直到call方法执行完毕并且return返回值为止
- call和run方法一样,也是通过start()来调用
public class TestCallable {
public static void main(String[] args) {
//获取Callable的线程对象
MyCallable myCallable=new MyCallable();
//将线程对象包装成futureTask对象,并接收线程的返回值
FutureTask<Integer> res=new FutureTask<>(myCallable);
//运行线程
new Thread(res).start();
try {
Integer integer = res.get();
System.out.println(integer);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class MyCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("线程计算1到100的和");
int sum=0;
for(int i =1;i<100;i++){
sum+=i;
}
return sum;
}
}
网友评论