為什麼沒有輸出結果?

為什麼沒有輸出結果?

public class Weather {
	//屬性 溫度和濕度
	private int temperature;
	private int humidity;
	private boolean flag=false;
	
	//getter 和setter 方法
	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 Auto-generated catch block
			e.printStackTrace();
		}
		this.setTemperature((int) (Math.random()*40));
		this.setHumidity((int) (Math.random()*100));
		
		}
		System.out.println("生成天氣數據[溫度 : " + this.getTemperature() + ", 濕度 : " + this.getHumidity() + "]");
		flag=false;
		notifyAll();
	}
	
	public synchronized void read(){
		if(flag){
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("讀取天氣數據[溫度 : " + this.getTemperature() + ", 濕度 : " + this.getHumidity() + "]");
			flag=true;
			notifyAll();
		}
	}
	
	@Override
	public String toString(){
		return "[溫度 : " + temperature + ", 濕度 : " + humidity + "]";
	}

}

public class GenerateWeather implements Runnable {
	Weather weather;
	
	public GenerateWeather(Weather weather) {
		// TODO Auto-generated constructor stub
		this.weather = weather;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true){
			weather.generate();
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

public class ReadWeather implements Runnable {
	Weather weather;
	
	public ReadWeather(Weather weather) {
		// TODO Auto-generated constructor stub
		this.weather = weather;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true){
			weather.read();
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

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();
	}
}


正在回答

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

3回答

首先,flag的初始值应该为true,如果为false,generate()这个方法一开始就wait()所以不会执行,就在那等待。

另外,下面的代码:

public synchronized void generate(){
        if(!flag){
        try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.setTemperature((int) (Math.random()*40));
        this.setHumidity((int) (Math.random()*100));
         
        }
        System.out.println("生成天氣數據[溫度 : " + this.getTemperature() + ", 濕度 : " + this.getHumidity() + "]");
        flag=false;
        notifyAll();
    }

注意if语句的大括号写错了,应该改成这样,注意看注释,read()方法也是一样的

public synchronized void generate(){
        if(!flag){
        try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }//大括号到这了
        this.setTemperature((int) (Math.random()*40));
        this.setHumidity((int) (Math.random()*100));
         //此处的大括号没了
        
        System.out.println("生成天氣數據[溫度 : " + this.getTemperature() + ", 濕度 : " + this.getHumidity() + "]");
        flag=false;
        notifyAll();
    }

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

  • 小張Roy 提问者 #1
    非常感谢!
    2017-04-21 18:15:03
提问者 小張Roy 2017-04-21 11:50:19

老師你好, 這是因為flag 的作用是判斷 要不要執行wait(); 語句, 所有if的括號不應該包含取值的語句嗎?

提问者 小張Roy 2017-04-20 19:01:22

在Eclipse 上運行..是空白一片, 那裡有問題? 謝謝!

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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