5-3自由编程

5-3自由编程

生成和读取时间的等待时间不一致,怎样实现在生成之后紧接着读取?

//GeneraWeather

public class GeneraWeather implements Runnable {

Weather weather;


public GeneraWeather(Weather weather) {

this.weather = weather;

}


@Override

public void run() {

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

weather.generate();


System.out.println("生成天气数据:" + weather+"第"+i+"次生成");

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


}

//ReadWeather

public class ReadWeather implements Runnable {

Weather weather;


public ReadWeather(Weather weather) {

this.weather = weather;

}


@Override

public void run() {

weather.read();

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

System.out.println("读取天气数据:" + weather+"第"+i+"次读取");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


}

//Weather 

1
<br>

public class Weather {

private int wendu;

private int shidu;

boolean f = false;


// getter setter 方法

public int getWendu() {

return wendu;

}


public void setWendu(int wendu) {

this.wendu = wendu;

}


public int getShidu() {

return shidu;

}


public void setShidu(int shidu) {

this.shidu = shidu;

}


// 生成天气

public synchronized void generate() {

if (f) {


try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


}

setShidu((int) (Math.random() * 100));

int b = (int) (Math.random() * 40);

setWendu(b);

f = false;

notifyAll();

}


// 读取天气

public synchronized void read() {


if (f) {

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


}

getShidu();

getWendu();

f =false;

notifyAll();//唤醒程序

}


@Override

public String toString() {

return " [温度=" + this.getWendu() + ", 湿度=" + this.getShidu() + "]";

}

}

//Test

1
<br>

public class Test {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Weather weather=new Weather();

GeneraWeather t=new GeneraWeather(weather);

Thread t1=new Thread(t);

t1.start();

ReadWeather n=new ReadWeather(weather);

Thread t2=new Thread(n);

t2.start();

}


}


正在回答

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

2回答

你的代码中,逻辑上有两点错误

1、输出语句应该写在Weather类中的generate()和read()方法中,每创建一次,就输出一下温度和湿度,每读取一次,就输出一下温度和湿度。而不是在ReadWeather和GeneraWeather类的循环中输出。

2、你的Weather类中的generate()和read()方法中逻辑有错误,

1)在generate()方法中,当设置完天气信息后,应该把flag赋值为true ,表示已经创建了天气信息。

2)而read()方法的if判断中,应该把 判断条件f改为 !f ,表示,没有天气信息,就进入wait()休眠。

3.建议同学注意代码规范,尽量以英文名称命名,注意用驼峰命名法则。如果我的回答解决了你的问题,请采纳,祝学习愉快.

  • shuaishuai66 提问者 #1
    非常感谢!
    2018-05-13 21:03:07
慕布斯37364 2018-05-12 23:19:15

你把休眠时间改成一致的试试呀。比如都改为Thread.sleep(5000);

  • 提问者 shuaishuai66 #1
    只能这样了?我的意思是在休眠时间不变的情况下,用wait()和notifyAll()方法不能实现线程同步吗?
    2018-05-13 09:25:09
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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