每天一个知识点(十三) 说一下runnable 和 callable 有什么区别?Future是什么?

简介: 执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回true;当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回false;当任务已经完成,执行cancel(...)方法将返回false

微信搜索《Java鱼仔》,每天一个知识点不错过


所有内容以及历史知识点均会更新到github上,欢迎star


(一)每天一个知识点


说一下runnable 和 callable 有什么区别?FutureTask是什么?


(二)回答


2.1 runnable和callable的区别


runnable和callable都可以用来编写多线程程序,两者的区别在于:


1.实现了runnable接口后无法返回结果信息,实现了callable接口后有返回值。


2.实现了runnable接口异常无法通过throws抛出异常,实现了callable接口后可以直接抛出Exception异常


2.2 Future是什么?


在使用callable接口实现多线程时,我们会用到FutureTask去获取返回值,那么Future和FutureTask是什么?


Future是一个获取异步计算结果的接口,而FutureTask是Future的一个实现类。


publicinterfaceFuture<V> {
booleancancel(booleanmayInterruptIfRunning);
booleanisCancelled();
booleanisDone();
Vget() throwsInterruptedException, ExecutionException;
Vget(longtimeout, TimeUnitunit)
throwsInterruptedException, ExecutionException, TimeoutException;
}

future接口的源码很简单,它实现了五个方法


boolean cancel(boolean mayInterruptRunning) :如果任务还没开始,执行cancel(...)方法将返回false;如果任务已经启动,执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回true;当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回false;当任务已经完成,执行cancel(...)方法将返回false。mayInterruptRunning参数表示是否中断执行中的线程。


boolean isCanceller() :如果任务完成前被取消,则返回true。


boolean isDone() :如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true。


V get() :获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。


V get(Long timeout , TimeUnit unit) :获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。


总结起来Future实现以下几个功能:可以中断正在执行的任务、可以判断任务是否还在执行、可以获取到任务执行后的结果。FutureTask是Future接口一个比较常用的实现类



目录
打赏
0
0
0
0
10
分享
相关文章
|
8月前
|
高并发编程之多线程锁和Callable&Future 接口
高并发编程之多线程锁和Callable&Future 接口
101 1
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
92 60
|
5月前
|
Java中Runnable和Callable有什么不同
【8月更文挑战第9天】Java中Runnable和Callable有什么不同
28 1
(八)深入并发之Runnable、Callable、FutureTask及CompletableFuture原理分析
关于Runnable、Callable接口大家可能在最开始学习Java多线程编程时,都曾学习过一个概念:在Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口以及实现Callable接口。但是实则不然,真正创建多线程的方式只有一种:继承Thread类,因为只有`new Thread().start()`这种方式才能真正的映射一条OS的内核线程执行,而关于实现Runnable接口以及实现Callable接口创建出的Runnable、Callable对象在我看来只能姑且被称为“多线程任务”,因为无论是Runnable对象还是Callable对象,最终执行都要交由Threa
137 1
|
8月前
|
多线程(CAS, ABA问题, Runnable & Callable & 僵尸线程 & 孤儿进程)
多线程(CAS, ABA问题, Runnable & Callable & 僵尸线程 & 孤儿进程)
74 1
|
8月前
|
Java并发编程:理解并使用Future和Callable接口
【2月更文挑战第25天】 在Java中,多线程编程是一个重要的概念,它允许我们同时执行多个任务。然而,有时候我们需要等待一个或多个线程完成,然后才能继续执行其他任务。这就需要使用到Future和Callable接口。本文将深入探讨这两个接口的用法,以及它们如何帮助我们更好地管理多线程。
创建线程的三种方式:继承Thread、Runnable 接口、Callable 接口
创建线程的三种方式:继承Thread、Runnable 接口、Callable 接口
ExecutorService、Callable、Future实现有返回结果的多线程原理解析
ExecutorService、Callable、Future实现有返回结果的多线程原理解析
89 0
并发编程系列教程(09) - Callable与Future模式
并发编程系列教程(09) - Callable与Future模式
61 0