java并发学习与实践——FutrueTask的使用示例
并发模式中,有一个称做Future模式。啥是Future模式捏? future,翻译成中文就是“未来,将来”的意思,可以简单地理解为 “明天的事明天再做” 。
比方说,你在做晚饭,而只有一个火炉,先炖个猪蹄要1小时,在等待猪蹄的这个时间里,你可以去淘米、洗菜、刷牙、抠脚,待猪蹄炖好了,再继续炒菜。
在编码中体现为:将耗时任务丢入单独的线程,从而使主线程能够继续执行其它的逻辑,待耗时任务执行完成后再做相应的处理。
Future模式是一钟十分常用的并发模式,所以JDK的并发包中自带一套实现。上类图:
这个自己画的,既然画了不能白画,囧!!!
下面这个是用
IntelliJ IDEA 自带工具生成的,真心太酸爽。
只看函数名称,也能基本了解FutureTask所提供的主要能力:
1、可判断执行状态(isDone())
2、可取消(cancel())
3、可读取返回结果(get())
4、可判断是否取消(isCancelled)
现在,我们可以解决上面这个猪脚的问题了:
public static class TestTask implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
//模拟时间消耗
System.out.println("--------漫长的一小时--------");
Thread.sleep(10000);
System.out.println("--------猪脚炖完--------");
return true;
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("--------开始做晚饭--------");
System.out.println("开始炖猪脚~~~");
System.out.println("--------猪脚下锅--------");
FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new TestTask());
Thread thread = new Thread(futureTask);
thread.start();
Thread.sleep(1000);
System.out.println("--------淘米--------");
Thread.sleep(1000);
System.out.println("--------洗菜--------");
Thread.sleep(1000);
System.out.println("--------刷牙--------");
Thread.sleep(1000);
System.out.println("--------抠脚--------");
//如果猪脚炖好了
if(futureTask.get()==true){
System.out.println("--------继续炒菜--------");
}
}
执行结果:
--------开始做晚饭--------
开始炖猪脚~~~
--------猪脚下锅--------
--------漫长的一小时--------
--------淘米--------
--------洗菜--------
--------刷牙--------
--------抠脚--------
--------猪脚炖完--------
--------继续炒菜--------