我检查了很多遍还是不知道为什么死锁

我检查了很多遍还是不知道为什么死锁

package com.imooc.weather;

public class Weather {
    private int temperature;
    private int humidity;
    boolean flag=false;//数据为空
    
	public int getTemperature() {
		return temperature;
	}
	public void setTemperature(int temperature) {
		this.temperature = temperature;
	}
	public int getHumidity() {
		return humidity;
	}
	public void setHumidity(int humidity) {
		this.humidity = humidity;
	}
    
	//生成天气数据
	public synchronized void generate() {
		if(flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			this.setTemperature((int) (Math.random()*40));
			this.setHumidity((int)(Math.random()*100));
			System.out.println("生成天气数据[温度:"+this.getTemperature()+",湿度:"+this.getHumidity());
			flag=true;
			notifyAll();
		}
	}
	
	public synchronized void read() {
		if(!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			System.out.println("读取天气数据[温度:"+this.getTemperature()+",湿度:"+this.getHumidity());
			flag=false;
			notifyAll();
	    }
	
	}
public String toString() {
		return "Weather[temperature="+this.getTemperature()+",湿度:"+this.getHumidity()+"]";
	}
	
}
package com.imooc.weather;

public class GenerateWeather implements Runnable{
    Weather weather;
    public GenerateWeather(Weather weather){
    	this.weather=weather;
    }
    
	@Override
	public void run() {
		for(int i=1;i<=100;i++) {
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			weather.generate();
		}
	}

}
package com.imooc.weather;

public class ReadWeather implements Runnable{
	 Weather weather;
	 public ReadWeather(Weather weather){
	    this.weather=weather;
	   }
	    
	public void run() {
		for(int i=1;i<=100;i++)
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			weather.read();
		}
		
}
package com.imooc.weather;

public class WeatherTest {
	
	public static void main(String[] args) {
        Weather weather=new Weather();
        new Thread(new GenerateWeather (weather)).start();
        new Thread(new ReadWeather(weather)).start();
	}
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小脸 2020-04-27 09:53:01

同学你好,非常抱歉,老师没能及时将更改的代码贴完整。

在GenerateWeather/ReadWeather类

先调用生成/读取的方法,在进行Thread.sleep();即可。如下所示:

http://img1.sycdn.imooc.com//climg/5ea63a9f0912942507570399.jpghttp://img1.sycdn.imooc.com//climg/5ea63ae9092bc0d806270409.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


好帮手慕小脸 2020-04-25 10:35:39

同学你好,生成与获取天气应该在if判断的外面,输出天气情况与唤醒线程。修改后代码如下:

http://img1.sycdn.imooc.com//climg/5ea3a1e709832c4c10260400.jpghttp://img1.sycdn.imooc.com//climg/5ea3a1f209a98a5210560343.jpg如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕嘟嘟 #1
    谢谢老师,我改完了以后,运行结果到第三行又锁了 不运行了,什么原因呢 生成天气数据[温度:39,湿度:66] 读取天气数据[温度:39,湿度:66] 生成天气数据[温度:20,湿度:61]
    2020-04-26 20:24:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师