乐趣区

关于java:多线程完成煮饭吃饭问题

问题:请用多线程基本知识实现两种状况下的煮饭、筹备
菜(买菜、洗菜)、炒菜、开始吃饭的性能。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

退出移动版