代码出错,循环一百次一下就输出完了,还有生成天气信息的时候,天气对象输出了两次
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 星