代码出错,循环一百次一下就输出完了,还有生成天气信息的时候,天气对象输出了两次
package com.imooc.task.one.bu3.a7xianchen.a5_3;
import java.util.concurrent.ThreadLocalRandom;
/**
* 天气类Weather,用于温度和湿度数据的存放和读取
*
* @author 15136
*
*/
public class Weather {
private int temperature; // 温度
private int humidity; // 湿度
private boolean flag; // 判断生成还是读取天气信息
/**
* 生成天气数据的方法
*/
public synchronized void generate() {
//进行判断当前是否可以生成天气信息:为假则允许,为真则不允许
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始生成天气数据
this.setTemperature(ThreadLocalRandom.current().nextInt(41));
this.setHumidity(ThreadLocalRandom.current().nextInt(101));
System.out.println("生成天气数据" + this.toString());
this.setFlag(true);
notifyAll();
}
/**
* 读取天气数据的方法
*/
public synchronized void read() {
//进行判断当前是否可以生成天气信息:为真则允许,为假则不允许
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(this);
System.out.println("读取天气数据" + this.toString());
this.setFlag(false);
notifyAll();
}
// 成员属性的封装:get/set方法
public int getTemperature() {
return temperature;
}
public int getHumidity() {
return humidity;
}
public boolean isFlag() {
return flag;
}
public void setTemperature(int temperature) {
this.temperature = temperature;
}
public void setHumidity(int humidity) {
this.humidity = humidity;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
return "[温度:" + this.getTemperature() + ",湿度" + this.getHumidity() + "]";
}
}package com.imooc.task.one.bu3.a7xianchen.a5_3;
/**
* 设计一个线程类ReadWeather,用于读取天气数据。
* 模拟读取100次天气数据,每次读取数据需要0.1秒的时间
* @author 15136
*
*/
public class GenerateWeather extends Thread {
//天气对象
private Weather weather;
//无参构造方法
public GenerateWeather() {
super();
}
//有参构造方法
public GenerateWeather(Weather weather) {
super();
this.weather = weather;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
this.getWeather().generate();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//成员属性的get/set方法
public Weather getWeather() {
return weather;
}
public void setWeather(Weather weather) {
this.weather = weather;
}
}package com.imooc.task.one.bu3.a7xianchen.a5_3;
public class ReadWeather extends Thread {
//天气对象
private Weather weather;
//无参构造方法
public ReadWeather() {
super();
}
//有参构造方法
public ReadWeather(Weather weather) {
super();
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();
}
}
}
}package com.imooc.task.one.bu3.a7xianchen.a5_3;
/**
* 模拟生成和读取数据的过程,要求实现生成一次,紧接着进行读取,不能出现不同步的情况
* @author 15136
*
*/
public class WeatherTest {
public static void main(String[] args) {
Weather weather = new Weather();
GenerateWeather generateWeather = new GenerateWeather(weather);
ReadWeather readWeather = new ReadWeather(weather);
Thread thread01 = new Thread(generateWeather);
Thread thread02 = new Thread(readWeather);
thread01.start();
thread02.start();
}
}1
收起
正在回答
3回答
同学你好,根据题目要求,生成的天气数据需要5秒,但是同学的生成天气的线程,却休眠时间却只有0.1秒哦

同学的生成天气的线程与读取天气的线程都是只休眠了100毫秒,也就是0.1秒哦!

所以建议同学将生成天气的线程修改为休眠5秒也就是5000毫秒,就即符合题目要求,也符合同学的计算了哦!例如

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
1. Java 零基础入门
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程



恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星