运行时直接生成两个天气数据?

运行时直接生成两个天气数据?

老师,我的代码在运行时会直接生成两个天气数据,后面才一次依据5S的频率生成。代码如下

package com.imooc.weather;


import java.util.Random;


public class Weather {

private int tep;

private int hum;

boolean flag=false;

public int getTep() {

return tep;

}

public void setTep(int tep) {

this.tep = tep;

}

public int getHum() {

return hum;

}

public void setHum(int hum) {

this.hum = hum;

}

//生成天气数据的方法

public synchronized void generate() {

//调用一个生成随机数的方法,随机生产温度和湿度

if(flag) {

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

Random t=new Random();

tep=t.nextInt(40);

this.setTep(tep);

hum=t.nextInt(101);

this.setHum(hum);

System.out.println("生成天气数据"+toString());

flag=true;

notifyAll();

}

//读取天气数据的方法

public synchronized void read() {

if (!flag) {

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("读取天气数据"+toString());

flag=false;

notifyAll();

}

//重写toString方法

@Override

public String toString() {

return " [温度:" + tep + ", 湿度:" + hum + "]";

}


}

package com.imooc.weather;


public class GenerateWeather implements Runnable {


Weather weather;


public GenerateWeather() {


}


public GenerateWeather(Weather weather) {

this.weather=weather;

weather.generate();


}

@Override

public void run() {

for(int i=1;i<100;i++) {

weather.generate();

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


}

package com.imooc.weather;


public class ReadWeather implements Runnable {



Weather weather;


public ReadWeather() {


}


public ReadWeather(Weather weather) {

this.weather=weather;

weather.read();


}

@Override

public void run() {

for(int i=1;i<100;i++) {

weather.read();

try {

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


}

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

new Thread(g).start();

new Thread(r).start();


}


}


正在回答

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

2回答

同学你好,这里之所以刚开始运行就弹出四条信息是因为:GenerateWeather和ReadWeather类中的有参构造方法中调用generate()方法和read()方法。导致打印语句执行了两次。修改如下:

http://img1.sycdn.imooc.com//climg/5f7d2cfe093e5a3e05860172.jpg

http://img1.sycdn.imooc.com//climg/5f7d2d080914adc404910183.jpg

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


好帮手慕阿莹 2020-09-30 15:15:51

同学你好,

同学是偶尔会出现直接生成两个天气数据呢,还是一直是开始会生成两个天气呢?

老师测试了一下,没有出现同学说的情况呀:


http://img1.sycdn.imooc.com//climg/5f742fa80917b8dc03440382.jpg

========

http://img1.sycdn.imooc.com//climg/5f742fc9091ccc2403750223.jpg

========

http://img1.sycdn.imooc.com//climg/5f742fdd09f2f96605030239.jpg

老师运行了几次没有发现同学说的这种情况,同学是否是写了一些类之后忘了保存呢?

同学重新保存试一下呢?

祝学习愉快。

  • 提问者 幕布斯2414477 #1
    我一点运行就会立即弹出老师运行结果的前四行,后面再依次弹出。 我理解的 点运行之后应该指挥弹出两行,后面再一次弹出。
    2020-09-30 17:12:59
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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