从有点基础开始学JUC:Callable接口

107 阅读1分钟

Callable接口

和Runable的区别

  • runnable没有返回值,而实现callable接口的任务线程能返回执行结果
  • callable接口实现类中的run方法允许异常向上抛出,可以在内部处理,try catch,但是runnable接口实现类中run方法的异常必须在内部处理,不能抛出
@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

注意:这是一个函数式接口

看一个简单的示例:

public class WorkCallAble implements Callable<Integer> {
​
    @Override
    public Integer call() throws Exception {
​
        return 1024;
    }
}

可以看到泛型类型即是call()方法的返回类型

具体使用

因为Thread类不接受实现Callable接口的实例,所以我们要采用迂回的方式创建线程,这要用到FutureTask这个类了,具体我们来看代码

public class Test {
​
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask = new FutureTask<>(
                () -> 1024
        );
​
        new Thread(futureTask).start();
​
        while (!futureTask.isDone()) {
            System.out.println("wait");
        }
​
        System.out.println(futureTask.get());
​
        System.out.println(futureTask.get());
    }
​
}

这段代码中我们新建了一个FutureTask的对象,然后再创建了一个线程,同时循环判断该线程是否执行完成,若执行完成,将线程的返回结果输出,因为futureTask

注意:FutureTask本质是Runable接口的实现类

注意:get是阻塞获取(显得呆呆的),轮询比阻塞好一点,线程还没完成的话起码能做点其他事

然后是输出的返回结果

wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
1024
1024
​
进程已结束,退出代码0

这就是这篇文章的内容了,欢迎大家的讨论,如有错漏,也请指出,谢谢~