JUC 一 Callable
欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
java.util.concurrent.Callable是一个泛型接口,只有一个call()方法
Callable和Runnable的区别
- Callable使用
call()
方法,Runnable使用run()
方法 call()可以返回值
,而run()方法没有返回值
call()可以抛出受检查的异常
,比如ClassNotFoundException,而run()不能抛出受检查的异常
继承关系
程序运行时,Runnable的实例或Callable的实例转化为RunnableFuture的实例FutureTask:
RunnableFuture继承了Runnable和Future接口
FutureTask是Future的实现类,而且不仅是Future又是Runnable,还包装了Callable,它是这两者的合体。
//FutureTask的基本操作都是通过自己的内部类Sync来实现的
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning); //还没计算完,可以取消计算过程
boolean isCancelled(); //判断计算是否被取消
boolean isDone(); //判断是否计算完
V get() throws InterruptedException, ExecutionException; //获取计算结果(如果还没计算完,也是必须等待的)
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
示例
Callable<User> callable= new Callable<>() {
@Override
public User call() throws Exception {
...
return new User();
}
};
FutureTask<User> task = new FutureTask<>(callable);
new Thread(task).start();
if (!task.isDone()) {
```
}
User user = task.get();