多线程实现订餐取餐

这篇博客通过Java实现了一个多线程的订餐取餐模拟。创建了`MeituanKnightThread`和`MeituanUserThread`两个线程类,分别代表送餐员和用户。程序中使用`Queue`作为订单队列,模拟用户等待取餐和送餐员通知取餐的过程。控制台输出展示了多个用户等待不同食物,以及送餐员通知用户取餐的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

/**
* Created by 风凌渡口 on 2017/6/21.
*/
public class TestThread {

public static void main(String[] args) throws InterruptedException {
    Queue queue = new ArrayBlockingQueue(5);

    Thread user1 = new MeituanUserThread(queue, "饺子");
    user1.setName("郭靖");
    user1.setPriority(1);
    user1.start();
    Thread user2 = new MeituanUserThread(queue, "扒鸡");
    user2.setName("洪七公");
    user2.setPriority(5);
    user2.start();
    Thread user3 = new MeituanUserThread(queue, "披萨");
    user3.setName("黄蓉");
    user3.start();
    Thread user4 = new MeituanUserThread(queue, "蜂蜜");
    user4.setName("龙儿");
    user4.start();
    Thread user5 = new MeituanUserThread(queue, "苹果");
    user5.setName("郭襄");
    user5.setPriority(10);
    user5.start();

    Thread knight = new MeituanKnightThread(queue);
    knight.setName("美团骑士杨过");
    knight.setPriority(10);
    knight.start();

    Thread.sleep(10000);

    Thread user6 = new MeituanUserThread(queue, "西湖醋鱼");
    user6.setName("程英");
    user6.setPriority(10);
    user6.start();
}

}

class MeituanKnightThread extends Thread{
private Queue queue;

public MeituanKnightThread(Queue queue) {
    this.queue = queue;
}

@Override
public void run() {
    while(true){
        synchronized (queue){
            while (queue.size() == 0){
                try {
                    System.out.println("暂时没有订单----------------------");
                    queue.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("通知用户取餐---------------------");
            queue.notifyAll();
        }
    }
}

}

class MeituanUserThread extends Thread{
private Queue queue;
private String foodName;

public MeituanUserThread(Queue queue, String foodName) {
    this.queue = queue;
    this.foodName = foodName;
    synchronized (queue){
        queue.add(foodName);
    }
}

@Override
public void run() {
    while (true){
        synchronized (queue){
            String food = (String) queue.peek();
            if(null == food || !food.equals(foodName)){
                try {
                    System.out.println(Thread.currentThread().getName() + "正在等餐" + food);
                    queue.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                queue.poll();
                System.out.println(Thread.currentThread().getName() + "已取餐" + food);
                queue.notifyAll();
                stop();
            }
        }
    }
}

}

控制台截取:

洪七公正在等餐饺子
黄蓉正在等餐饺子
郭襄正在等餐饺子
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
龙儿正在等餐饺子
郭靖已取餐饺子
龙儿正在等餐扒鸡
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
洪七公已取餐扒鸡
黄蓉已取餐披萨
郭襄正在等餐蜂蜜
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
通知用户取餐———————
龙儿已取餐蜂蜜
郭襄已取餐苹果
暂时没有订单———————-
程英已取餐西湖醋鱼
暂时没有订单———————-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值