问题:请用多线程基本知识实现两种状况下的煮饭、筹备
菜(买菜、洗菜)、炒菜、开始吃饭的性能。1、筹备菜(买菜、洗菜):1秒,
炒菜:2秒,煮饭:5秒 2、筹备菜(买菜、洗菜):1秒,炒菜:8秒,煮饭:
5秒。阐明:只有煮饭实现、筹备菜、炒菜实现,能力开始吃饭,两种状况
下,在尽量短的工夫内实现所有动作。
办法:通过FutureTask + Callable + 线程状态的判断加以实现
煮饭类
package com.high.currency11;import java.util.concurrent.Callable;public class Rice implements Callable { @Override public Rice call() throws Exception { System.out.println("开始煮饭"); Thread.sleep(5000); // 模仿煮饭工夫 System.out.println("煮饭实现"); return new Rice(); }}
买菜洗菜类
package com.high.currency11;import java.util.concurrent.Callable;public class Vegetable implements Callable { @Override public Vegetable call() throws Exception { System.out.println("开始买菜、洗菜"); Thread.sleep(1000); // 模仿买菜,洗菜工夫 System.out.println("买菜、洗菜已实现"); return new Vegetable(); }}
炒菜类
package com.high.currency11;import java.util.concurrent.Callable;public class Cook implements Callable { @Override public Cook call() throws Exception { System.out.println("开始炒菜"); // 模仿炒菜工夫 Thread.sleep(8000); Cook cook = new Cook(); System.out.println("炒菜结束"); return cook; }}
吃饭类
package com.high.currency11;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;public class Dinner { public static void haveDinner() throws InterruptedException, ExecutionException { Rice rice = new Rice(); FutureTask<Rice> riceTask = new FutureTask(rice); Thread rThread = new Thread(riceTask); rThread.start(); Vegetable veg = new Vegetable(); FutureTask vegTask = new FutureTask(veg); Thread vThread = new Thread(vegTask); vThread.start(); vThread.join(); Cook cook=new Cook(); FutureTask<Cook> cookTask = new FutureTask(cook); new Thread(cookTask).start(); if(!cookTask.isDone()){ System.out.println("菜没炒好,就持续等吧"); } if(!riceTask.isDone()){ System.out.println("饭没煮好,就持续等吧"); } Rice riceResult= riceTask.get(); Cook cookResult=cookTask.get(); if(null!=riceResult&&null!=cookResult) { System.out.println("菜炒好了,饭也煮好了,大家一起吃饭吧"); } }}
测试类
package com.high.currency11;import java.util.concurrent.ExecutionException;public class Test { public static void main(String[] args) { long startTime = System.currentTimeMillis(); try { Dinner.haveDinner(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("整个过程,共耗时" + (System.currentTimeMillis() - startTime) + "ms"); }}
测试后果
开始煮饭开始买菜、洗菜买菜、洗菜已实现菜没炒好,就持续等吧饭没煮好,就持续等吧开始炒菜煮饭实现炒菜结束菜炒好了,饭也煮好了,大家一起吃饭吧整个过程,共耗时9009ms
github