码农往事
我的代码为什么这么丑?一定是因为我长的不好看
posts - 29,comments - 86,trackbacks - 0
并发模式中,有一个称做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("--------继续炒菜--------");
        }
    }
执行结果:
--------开始做晚饭--------
开始炖猪脚~~~
--------猪脚下锅--------
--------漫长的一小时--------
--------淘米--------
--------洗菜--------
--------刷牙--------
--------抠脚--------
--------猪脚炖完--------
--------继续炒菜--------
posted on 2014-10-23 16:13 Jimi 阅读(5230) 评论(3)  编辑  收藏

FeedBack:
# re: java并发学习—— FutrueTask的使用示例
2014-10-23 23:15 | 王铎开
LZ请原谅我的无知,这不就是按顺序执行吗?  回复  更多评论
  
# re: java并发学习—— FutrueTask的使用示例
2014-10-24 00:05 | Jimi
@王铎开
你看看猪脚下锅到出锅,你已经淘完米、洗完菜、刷完牙、抠完脚了  回复  更多评论
  
# re: java并发学习与实践—— FutrueTask的使用示例
2014-11-17 16:52 | 闵凉宇
不是吧,后面几个逻辑和炖猪脚是同时执行的吧。。@王铎开
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: