FutureTask的使用方法及实现原理

FutureTask是Java并发包中的一个实现,它既是计算任务对象也是结果对象,支持取消操作。文章介绍了FutureTask的使用方法,包括提交到线程池、通过get()获取结果以及cancel()的处理。同时,详细剖析了FutureTask的实现原理,包括基于volatile的同步状态、Treiber栈保存等待线程、取消操作的实现以及等待线程的等待操作和计算线程的run()方法。
摘要由CSDN通过智能技术生成

FutureTask用法介绍

FutureTask是JDK并发包为Future接口提供的一个实现,代表一个支持取消操作(cancel)的异步计算任务。它实现了Future接口和Runnable接口,所以既是计算任务对象也是结果对象。它可以提交到线程池中去执行,并且结果直接放在自身这个FutureTask中,不是放在另外一个Future中。我们把FutureTask提交到线程池运行的方法一般是先实现一个Callable或Runnable,然后再把它传给FutureTask的对应构造函数从而创建一个FutureTask,然后把这个FutureTask提交给Executor.execution()。代码如下:

FutureTask<String> future = new FutureTask<String>(
 new Callable<String>() {
 public String call() {
 return searcher.search(target);
 }
 });
executor.execute(future);

我们通过FutureTask.get()方法取得计算结果:如果调用get()的时候,计算还没结束,则当前线程阻塞;如果计算已经完成,则get()立即返回结果,如下图所示;如果计算过程出错、抛出异常,则get()不阻塞并且直接抛出异常(异常信息封装在这个异常的clause中);如果调用了cancel(),又调用get(),则抛出CancellationException。调用get()的时候,记得要捕捉异常。FutureTask在计算完成之后不能再次计算(复用),因此要想重新计算,需要调用runAndReset() 或者重新创建一个FutureTask。

FutureTask的实现

FutureTask的老版本实现是基于
AbstractQueuedSynchronizer的,这样会有一个缺点,当多个线程对同一个FutureTask执行cancel的时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值