qq_32197807 2022-05-25 12:27 采纳率: 100%
浏览 20
已结题

一个关于多线程售票的问题,我这属于死锁吗,求解决!!

问题场景,1000瓶水 三个人拿,每人每次拿20瓶,库存少于100瓶则补充,大家看我运行截图,出大问题。
运行结果部分:
比赛1拿走20瓶水,现场馆有水980瓶水
比赛1拿走20瓶水,现场馆有水960瓶水
比赛1拿走20瓶水,现场馆有水940瓶水
比赛1拿走20瓶水,现场馆有水920瓶水
比赛1拿走20瓶水,现场馆有水900瓶水
比赛1拿走20瓶水,现场馆有水880瓶水
比赛1拿走20瓶水,现场馆有水860瓶水
比赛1拿走20瓶水,现场馆有水840瓶水
以下重复
··
一直都是就比赛1这一个线程在搬水,其他线程怎么不动啊!!

import java.lang.constant.Constable;

class Water {
public static int num;

public Water(int num) {
    this.num=num;
}

public int getNum() {
    return num;
}

public void setNum(int num) {
    this.num = num;
}

}

class Game extends Thread{
private Water water;
private String name;
int n;

public Game(Water water, String name, int n) {
    this.water = water;
    this.name = name;
    this.n = n;
}
private static Object object=new Object();

@Override
public void run() {
    synchronized (object) {
        while (water.num > 100) {
            if (water.num > 100) {
                water.num = water.num - n;
                System.out.println(name + "拿走" + n + "瓶水," + "现场馆有水" + water.num + "瓶水");
            }
        }
    }
    try{
        sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

public class Test {
public static void main(String[] args) {
Water water = new Water(1000);
Game game1 = new Game(water, "比赛1", 20);
Game game2 = new Game(water, "比赛2", 20);
Game game3 = new Game(water, "比赛3", 20);
game1.start();
game2.start();
game3.start();
}
}

  • 写回答

2条回答 默认 最新

  • 皮蛋不吃粥 2022-05-25 13:22
    关注

    线程一进来就没出去,肯定都他拿啊 ;没进行线程通信,没切换时间片。
    有用采纳一下,有问题问我

    class Game extends Thread{
    private Water water;
    private String name;
    int n;
    
    public Game(Water water, String name, int n) {
        this.water = water;
        this.name = name;
        this.n = n;
    }
    private static Object object=new Object();
     
    @Override
    public void run() {
        synchronized (object) {
            while (water.num > 100) {
                object.notifyAll();
                if (water.num > 100) {
                    water.num = water.num - n;
                    System.out.println(name + "拿走" + n + "瓶水," + "现场馆有水" + water.num + "瓶水");
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        try{
            sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
    public class Water {
        public int num;
    
        public Water(int num) {
            this.num=num;
        }
    
        public int getNum() {
            return num;
        }
    
        public void setNum(int num) {
            this.num = num;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 已采纳回答 5月26日
  • 创建了问题 5月25日

悬赏问题

  • ¥15 使用yolov5-7.0目标检测报错
  • ¥15 对于这个问题的解释说明
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备