美文网首页
1.烧水泡茶

1.烧水泡茶

作者: 乙腾 | 来源:发表于2019-08-28 20:16 被阅读0次

1.需求:

代码实现

2.analysis

并发编程分析思路:

分工,同步,互斥。

先分析同步:

烧水和洗茶具是同步的,所以分为两个任务。一个任务烧水,一个任务洗茶具。

优化分析:将一个任务做为主任务

一种最优的分工方案可以是下图所示的这样:用两个线程 T1 和 T2 来完成烧水泡茶程序,T1 负责洗水壶、烧开水、泡茶这三道工序,T2 负责洗茶壶、洗茶杯、拿茶叶三道工序,其中 T1 在执行泡茶这道工序时需要等待 T2 完成拿茶叶的工序。对于 T1 的这个等待动作,你应该可以想出很多种办法,例如 Thread.join()、CountDownLatch,甚至阻塞队列都可以解决,不过今天我们用 Future 特性来实现。

3.code

ShaoShuiMain

···

packagecn.pl.future.shaoshuiTest;

importjava.util.concurrent.ExecutionException;

importjava.util.concurrent.FutureTask;

importcn.pl.future.shaoshuiTest.childThread.ShaoShui;

importcn.pl.future.shaoshuiTest.childThread.XiTools;

publicclassShaoShuiMain{

    publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionException{

        //任务2  洗工具

        FutureTask<String>f2=newFutureTask<>(newXiTools());

        //任务1  烧水

        FutureTask<String>f1=newFutureTask<>(newShaoShui(f2));

        Threadt1=newThread(f1);

        Threadt2=newThread(f2);

        t1.start();

        t2.start();

        //等待上茶

        System.out.println(f1.get());

    }

}

​···

ShaoShui

···

packagecn.pl.future.shaoshuiTest.childThread;

importjava.util.concurrent.Callable;

importjava.util.concurrent.FutureTask;

importjava.util.concurrent.TimeUnit;

publicclassShaoShuiimplementsCallable<String>{

    FutureTask<String>f2;

    publicShaoShui(FutureTask<String>f2) {

        // TODO Auto-generated constructor stub

        this.f2=f2;

    }

    @Override

    publicStringcall()throwsException{

        // TODO Auto-generated method stub

        System.out.println("T1: 洗水壶...");

    TimeUnit.SECONDS.sleep(1);

    System.out.println("T1: 烧开水...");

    // 获取 T2 线程的茶叶 

    Stringtf=f2.get();

    TimeUnit.SECONDS.sleep(15);

    System.out.println("T1: 拿到茶叶:"+tf);

    System.out.println("T1: 泡茶...");

    return" 上茶:"+tf;

    }

}

​···

XiTools

packagecn.pl.future.shaoshuiTest.childThread;

importjava.util.concurrent.Callable;

importjava.util.concurrent.TimeUnit;

publicclassXiToolsimplementsCallable<String>{

    @Override

    publicStringcall()throwsException{

        // TODO Auto-generated method stub

        System.out.println("T2: 洗茶壶...");

    TimeUnit.SECONDS.sleep(1);

    System.out.println("T2: 洗茶杯...");

    TimeUnit.SECONDS.sleep(2);

    System.out.println("T2: 拿茶叶...");

    TimeUnit.SECONDS.sleep(1);

    return" 龙井 ";

    }

}

运行结果:

相关文章

  • 1.烧水泡茶

    1.需求: 代码实现 2.analysis 并发编程分析思路: 分工,同步,互斥。 先分析同步: 烧水和洗茶具是同...

  • 烧水泡茶

    先来讲华罗庚烧水泡茶的故事,烧水泡茶的办法有三种。 办法甲:先做好准备工作,洗开水壶、茶壶、茶杯,拿茶叶。一切就绪...

  • 【工作】“烧水泡茶”的故事

    完成“烧水泡茶”需要多长时间呢? 可以是先烧水,等水烧开之后洗茶具,最后泡茶;也可以是在烧水的同时洗茶具,水开...

  • 上班族如何在20分钟内做好早餐和午餐

    记得小学课本里学过华罗庚烧水泡茶的故事,讲的是关于烧水、洗茶壶、茶杯和泡茶的几种先后顺序的最优选择。还依稀的记得当...

  • 时间统筹的小故事

    大家都听过“烧水泡茶”的故事:烧水泡茶根据它的先后顺序,我们可以有以下几种方案 办法甲:先做好准备工作,洗开水...

  • 复日

    每天起来,烧水,吃药,泡茶,看书,阳光撒下,幸福的日子会萌发。

  • 茶之缘

    小时候,我总是喜欢看爷爷烧水泡茶,那个时候爷爷一烧水泡茶屋子里总会来了很多邻居,他们挤在一张方桌上,一边喝茶一边聊...

  • 2020流水账9

    5:20老板—7:10 起床。 服药,烧水,六一枇杷吃喝拉撒。 洗漱,烧水,泡茶。 罗胖60秒+发朋友圈 9:30...

  • 这个世界最可依靠的人是自己

    今天爱人烧水,水开了。我喊他泡茶,喊的过程中,他在看手机。 然后我就自己去泡茶,前后也就一分钟,我在泡茶的过程中领...

  • 坚持分享第28天《品茶》

    今天,家里气氛和谐,老公提议泡茶喝,增加一下韵味,我们把买好搁置好久的茶具都搬出来,开始烧水泡茶、品茶,心情大好。...

网友评论

      本文标题:1.烧水泡茶

      本文链接:https://www.haomeiwen.com/subject/heyykctx.html