futureTask

java并发 专栏收录该内容
4 篇文章 0 订阅
FutureTask可以把它当作是闭锁的一种(FutureTask的实现描述了一个抽象的可携带结果的计算)。
FutureTask的通过Callable实现的(带返回值的Runnable),并且有3个状态:等待、运行和完成。
完成包括:正常结束、取消和异常。一旦FutureTask进入完成状态,它会永远停止在这个状态上。

boolean cancel(boolean mayInterruptIfRunning);
参数为true时,强制中断当前任务。
boolean isCancelled();
如果任务被取消返回true。
boolean isDone();
判断是否完成,而完成状态就是上面的3个状态。
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
可以中断、超时

使用场景:银行需要实时导出截止到当前时间的财务报表(除了当天的数据都已经固化好了,那么比较耗时的计算就是当天的数据)
样例:
public static void main (String[] args)
{
FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>()
{
@Override public Integer call () throws Exception
{
System.out.println(Thread.currentThread().getName() + "操作比较耗时的当前数据计算~~~");
Thread.sleep(new Random().nextInt(5000));
int localData = new Random().nextInt(100);
System.out.println("耗时计算返回结果~~~" + localData);
return localData;
}
});
new Thread(task).start();
Integer fixData = 1;
Integer localData = 0;
try
{
System.out.println(Thread.currentThread().getName() + "获取固化好的数据开始~~~");
Thread.sleep(new Random().nextInt(1000));
System.out.println(Thread.currentThread().getName() + "获取固化好的数据结束~~~~");
while (!task.isDone())
{
System.out.println("耗时计算还在进行中~~~~请等待!!");
Thread.sleep(1000);
}


System.out.println(Thread.currentThread().getName() + "做聚合操作~~~~");
localData = task.get();
Integer result = fixData + localData;
System.out.println(Thread.currentThread().getName() + "返回报表数据~~~~" + result);
} catch (InterruptedException e)
{
e.printStackTrace();
} catch (ExecutionException e)
{
e.printStackTrace();
}
}

结果打印
main获取固化好的数据开始~~~
Thread-0操作比较耗时的当前数据计算~~~
main获取固化好的数据结束~~~~
耗时计算还在进行中~~~~请等待!!
耗时计算还在进行中~~~~请等待!!
耗时计算还在进行中~~~~请等待!!
耗时计算还在进行中~~~~请等待!!
耗时计算返回结果~~~81
main做聚合操作~~~~
main返回报表数据~~~~82



  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值