Runnable、Callable、Future、RunnableFuture 和 FuturTask 到底是些啥,到底有啥关系?

直接上来先说结论(我比较喜欢这种方式,毕竟有的文章一开始就给你讲论证,讲了半天都不知道论题的结果是什么)

{@interface Runnable} :他的表示是希望被另一个线程所执行,有点抽象,说白了,就是你这个接口所实现的类,java是希望你放到Thread里面去执行的,去start的。

@interface Callable} : 他首先类似于Runnable,他的设计之初也同样是希望被另一个线程所执行,但是他是有返回值的

{@interface Future} :首先它是一个接口。其次,他表示的是一个异步的计算结果,注意,他表示的只是一个结果,并不表示它是一个可执行的Thread,类比一下Runnable。

//如果任务还没开始,执行cancel(...)方法将返回false;
//如果任务已经启动,执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,
//如果停止成功,返回true;
//当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),
//此时返回false;
//当任务已经完成,执行cancel(...)方法将返回false。
//mayInterruptRunning参数表示是否中断执行中的线程。
boolean cancel(boolean mayInterruptIfRunning);
//如果任务完成前被取消,则返回true。
boolean isCancelled();
//如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true。
boolean isDone();
//获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。
V get() throws InterruptedException, ExecutionException;
//获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,
//如果阻塞时间超过设定的timeout时间,该方法将抛出异常。
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;

{@interface RunnableFuture  extends Runnable, Future<V>} :依然是一个接口,并且继承自 Runnable(这玩意儿不解释了吧)、Future他表示的是一个应该被异步线程执行的(Runnable的语义,毕竟是接口,只有靠语义来描述,毕竟你爱咋实现,他也管不着),并且可以允许访问其结果的。

void run();

这个方法,嗯... 怎么说呢,他确实是和Runnable里的run()重叠了,但是我理解他这里可能是想加强语义,让大家能把RunnableFuture和Future这俩玩意儿区别开

{@class FuturTask implements RunnableFuture<V>} : ok,这玩意儿是一个实现类,实现了RunnableFuture 接口我用一段源码带大家感受一下,比较口述能力有限。

java.util.concurrent.AbstractExecutorService#submit(java.util.concurrent.Callable<T>)

java.util.concurrent.AbstractExecutorService#newTaskFor(java.util.concurrent.Callable<T>)

感受到了吗?首先AbstractExecutorService,这个东西,是线程池也就是大家熟知的ThreadPoolExecutor的继承类,他又实现于ExecutorService。ok,所以上面这段代码,就是当我创建一个任务向线程池提交的时候(submit)的方法。

ok,bb了怎么多,有的小伙伴还是没有感觉,下面,举一个例子找找感觉

这再没有感觉,我也没办法了

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值