老师,为啥我这么写有问题呢?

来源:5-3 自由编程

热爱编程学习

2022-03-14 01:05:55


package com.imooc.weather;

public class WeatherTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Weather w=new Weather();
		GenerateWeather g=new GenerateWeather(w);
		ReadWeather r=new ReadWeather(w);
		Thread t1=new Thread(g);
		Thread t2=new Thread(r);
		t1.start();
		t2.start();
		
	}

}

package com.imooc.weather;

public class Weather {
	private int temperature;
	private int humidity;
	private boolean flag=false;
	public Weather() {}
	
	public Weather(int temperature, int humidity) {
		super();
		this.temperature = temperature;
		this.humidity = humidity;
		//this.flag = flag;
	}
	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() {
		int n=0,y=0;
		if(!flag) {
		try {
			wait();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		n=(int)(Math.random()*40);
		setTemperature(n);
		
		y=(int)(Math.random()*100);
		setHumidity(y);
		}
		System.out.println("生成"+n+"天气"+y+"温度");
		flag=false;
		notifyAll();
	}
	
	public synchronized void read() {
		if(flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("读取"+getTemperature()+"天气"+getHumidity()+"温度");
			flag=true;
			notifyAll();
		}
		
		
		//System.out.println("读取"+getTemperature()+"天气"+getHumidity()+"温度");
		//getTemperature();
		//getHumidity();
	}
	
	
	@Override
	public String toString() {
		return "温度: " + temperature + "湿度:" + humidity;
	}
	
	
	
	
}


package com.imooc.weather;

public class ReadWeather implements Runnable{
	Weather weather;
	
	public ReadWeather(Weather weather) {
		super();
		this.weather = weather;
	}


	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<20;i++) {
		weather.read();
		}
		
	}
	
}




package com.imooc.weather;

public class GenerateWeather implements Runnable{
	Weather weather;

	public GenerateWeather(Weather weather) {
		super();
		this.weather = weather;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<20;i++) {
			weather.generate();
		}
		
	}
	
	
}


写回答

1回答

好帮手慕小蓝

2022-03-14

同学你好,同学代码的运行流程如下:

一、启动程序之后,有两种执行的可能:

1.先执行read线程,此时代码中的flag为false,略过if代码,什么都不做

2.先执行generate线程,此时此时代码中的flag为false,进入if代码块,执行wait,线程进入等待。

二、由上面分析可知:

1.如果先执行第二种情况,generate线程进入wait状态,此时会不断执行read线程直至20次read执行结束,程序阻塞在generate线程中。由于同学的代码中read线程没有任何输出,所以仅能看到程序没有终止,是因为generate线程还在阻塞、

2.如果先执行第一种情况,read线程线程的代码什么都不做,继续下一次线程选择。任何情况下,只要选择到read线程都会什么都不做,但是一旦选择到generate线程,就会发生上面的情况。

综上所述,同学代码中存在严重的逻辑错误,建议同学复习并深刻理解之后重新编码。

祝学习愉快~


0

0 学习 · 9886 问题

查看课程