请老师帮我分析一下代码问题

请老师帮我分析一下代码问题

import java.util.Random;

public class Weather {
    private int temperature;
    private int humidity;
    boolean flag = false;
    public synchronized int getTemperature() {
        if (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        flag = true;
        notifyAll();
        return temperature;
    }

    public synchronized int getHumidity() {
        if (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        flag = true;
        notifyAll();
        return humidity;
    }

    public synchronized void setTemperature(int temperature) {
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.temperature = temperature;
        flag = false;
        notifyAll();
    }

    public synchronized void setHumidity(int humidity) {
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.humidity = humidity;
        flag = false;
        notifyAll();
    }

    public void generate() {
        Random r = new Random();
        setTemperature(r.nextInt(40));
        setHumidity(r.nextInt(100));
        System.out.println("生成天气数据"+ this.toString());
    }

    public void read() {
        System.out.println("读取天气数据" + this.toString());
    }

    @Override
    public String toString() {
        return "[温度:" + temperature + ",湿度:" + humidity + "]";
    }
}

public class GenerateWeather implements Runnable {
    Weather weather;
    GenerateWeather(Weather weather) {
        this.weather = weather;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            weather.generate();
            try {
                wait(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

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

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            weather.read();
            try {
                wait(100);
            } catch (InterruptedException e) {
                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();
    }
}


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

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

3回答
好帮手慕阿满 2019-03-18 18:21:41

同学你好,同学的Weather类中的代码有些问题,应该将判断flag的代码写在generate()和read()方法中,参考如下代码:

import java.util.Random;

public class Weather {
	private int temperature;
	private int humidity;
	boolean flag = false;

	public  int getTemperature() {
		return temperature;
	}

	public synchronized void setTemperature(int temperature) {
		this.temperature = temperature;
	}

	public synchronized int getHumidity() {
		return humidity;
	}

	public synchronized void setHumidity(int humidity) {
		this.humidity = humidity;
	}

	public synchronized void generate() {
		if(flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		Random r = new Random();
		setTemperature(r.nextInt(41));
		setHumidity(r.nextInt(101));
		System.out.println("生成天气数据" + this.toString());
		flag = true;
		notifyAll();
		
	}

	public synchronized void read() {
		if(!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		temperature = getTemperature();
		humidity = getHumidity();
		flag = false;
		notifyAll();
		System.out.println("读取天气数据" + this.toString());
	}

	@Override
	public String toString() {
		return "[温度:" + temperature + ",湿度:" + humidity + "]";
	}
}

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

  • 提问者 巴呆丶 #1
    能详细说明一下吗老师
    2019-03-18 18:25:59
  • 好帮手慕阿满 回复 提问者 巴呆丶 #2
    这里应该给生成天气数据和读取天气数据的generate()和read()方法加synchronized,然后判断flag,在生成或读取数据后,修改flag的值,并使用notifyAll()方法唤醒线程。祝:学习愉快~
    2019-03-18 19:45:26
提问者 巴呆丶 2019-03-18 16:53:51
import java.util.Random;

public class Weather {
    private int temperature;
    private int humidity;
    boolean flag = false;
    public synchronized int getTemperature() {
        if (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        flag = true;
        notifyAll();
        return temperature;
    }

    public synchronized void setTemperature(int temperature) {
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.temperature = temperature;
        flag = false;
        notifyAll();
    }

    public synchronized int getHumidity() {
        if (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        flag = true;
        notifyAll();
        return humidity;
    }

    public synchronized void setHumidity(int humidity) {
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.humidity = humidity;
        flag = false;
        notifyAll();
    }

    public void generate() {
        Random r = new Random();
        setTemperature(r.nextInt(41));
        setHumidity(r.nextInt(101));
        System.out.println("生成天气数据"+ this.toString());
    }

    public void read() {
        temperature = getTemperature();
        humidity = getHumidity();
        System.out.println("读取天气数据" + this.toString());
    }

    @Override
    public String toString() {
        return "[温度:" + temperature + ",湿度:" + humidity + "]";
    }
}
public class GenerateWeather implements Runnable {
    Weather weather;
    GenerateWeather(Weather weather) {
        this.weather = weather;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            weather.generate();
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class ReadWeather implements Runnable{
    Weather weather;
    ReadWeather(Weather weather) {
        this.weather = weather;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            weather.read();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                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();
    }
}


提问者 巴呆丶 2019-03-18 16:52:34

这里是我修改后的代码,可以运行了,但是跟题目要求的运行结果不同,请老师运行这段代码。

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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