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日

悬赏问题

  • ¥100 已有python代码,要求做成可执行程序,程序设计内容不多
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥15 小红薯封设备能解决的来
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答
  • ¥20 在本地部署CHATRWKV时遇到了AttributeError: 'str' object has no attribute 'requires_grad'
  • ¥15 vue+element项目中多tag时,切换Tab时iframe套第三方html页面需要实现不刷新
  • ¥50 深度强化学习解决能源调度问题