美文网首页
谈谈Runnable,Callable,Future

谈谈Runnable,Callable,Future

作者: lenny611 | 来源:发表于2021-05-09 20:23 被阅读0次

Runnable和Callable的主要区别
Callable源码解释如下:

 * <p>The {@code Callable} interface is similar to {@link
 * java.lang.Runnable}, in that both are designed for classes whose
 * instances are potentially executed by another thread.  A
 * {@code Runnable}, however, does not return a result and cannot
 * throw a checked exception.

即Callable具有返回值且可以捕捉异常,而Runnable不可以。

Future是一个存储异步任务产生的结果的接口,正常用法就是将一个Callable任务扔给线程池执行(扔给线程池之后就继续往下执行了),然后异步等待得到返回结果。简单Demo如下:

    private static void useDemo() throws InterruptedException, ExecutionException {
        ExecutorService executorService= Executors.newSingleThreadExecutor();
        Callable<Integer> callable= () -> {
            int sum=0;
            for (int i = 0; i < 1000000; i++) {
                sum+=i;
            }
            TimeUnit.SECONDS.sleep(2);
            return sum;
        };
        
        // 把future任务提交给线程池执行,但是返回结果是异步的
        Future<Integer> submit = executorService.submit(callable);
        System.out.println(submit.isDone());
        System.out.println("阻塞开始");
        // 如果一直得不到返回结果,则一直在阻塞
        System.out.println(submit.get());
        System.out.println("阻塞结束");
        executorService.shutdown();
    }

FutureTask是Future的唯一实现类,同时也实现了Runnable接口,也可以直接将FutureTask直接提交到线程池执行。
简单总结如下:
1.Callable=Runnable+返回值
2.Future: 存储异步任务产生的结果
3.FutureTask:既是Future又是Runnable

相关文章

网友评论

      本文标题:谈谈Runnable,Callable,Future

      本文链接:https://www.haomeiwen.com/subject/zdsvdltx.html