futureTask

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值