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();
}
}
正在回答
你的代码中,逻辑上有两点错误
1、输出语句应该写在Weather类中的generate()和read()方法中,每创建一次,就输出一下温度和湿度,每读取一次,就输出一下温度和湿度。而不是在ReadWeather和GeneraWeather类的循环中输出。
2、你的Weather类中的generate()和read()方法中逻辑有错误,
1)在generate()方法中,当设置完天气信息后,应该把flag赋值为true ,表示已经创建了天气信息。
2)而read()方法的if判断中,应该把 判断条件f改为 !f ,表示,没有天气信息,就进入wait()休眠。
3.建议同学注意代码规范,尽量以英文名称命名,注意用驼峰命名法则。如果我的回答解决了你的问题,请采纳,祝学习愉快.
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧