JUC 一 Callable

java.util.concurrent.Callable是一个泛型接口,只有一个call()方法

Callable和Runnable的区别

  1. Callable使用call()方法,Runnable使用run()方法
  2. call()可以返回值,而run()方法没有返回值
  3. 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();
原文地址:https://www.cnblogs.com/loveer/p/11409202.html