5-3的一些问题 为什么在 实现runnable类种方法的语句打印输出也会是随机的,而非确定的
老师,您好,我在天气类的作业中,添加了 一句输出语句,打印输出这是第几次读天气/生成天气。 这些输出语句也是位置不确定的。想知道是为什么吖。
下面是我的作业的完整代码和输出
Weather 类
package com.imooc.thread; import java.util.Random; public class Weather { private int temperature; private int humidity; private boolean flag = false;// True to read // Constructor public Weather() { // TODO Auto-generated constructor stub } public Weather(int temp, int humidity) { this.setHumidity(humidity); this.setTemperature(temp); } // Getters and Setters public int getTemperature() { return temperature; } public void setTemperature(int temperature) { this.temperature = temperature; } public int getHumidity() { return humidity; } public void setHumidity(int humidity) { this.humidity = humidity; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } @Override public String toString() { return "Weather data [temperature=" + temperature + ", humidity=" + humidity + "]"; } // Methods (read and generate methods must be synchronized) // They can not be interrupted by other when one thread calls them public synchronized void read() { if(this.flag) { //if it is the time to read the weather read them System.out.println("read Weather feature : " + this.toString()); //update the flag and notify other thread. flag = false; this.notifyAll(); }else { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void generate() { synchronized (this) { if(!this.flag) { Random random = new Random(); this.setHumidity(random.nextInt(41)); this.setTemperature(random.nextInt(101)); System.out.println("Generate Weather feature : " + this.toString()); //After generate weather, modify the flag and notify other threads this.setFlag(true); this.notifyAll(); }else { //if this time is not to generate weather, releases the lock on the object // so that another thread can jump in and acquire a lock. try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
两个实现runnable 接口的类
package com.imooc.thread; public class GenerateWeather implements Runnable { private Weather weather; public GenerateWeather() { // TODO Auto-generated constructor stub } public GenerateWeather(Weather weather) { super(); this.setWeather(weather); } public Weather getWeather() { return weather; } public void setWeather(Weather weather) { this.weather = weather; } @Override public void run() { // TODO Auto-generated method stub for(int i = 0; i<100; i++) { weather.generate(); System.out.println("第"+i+ "次写"); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package com.imooc.thread; public class ReadWeather implements Runnable { private Weather weather; public ReadWeather() { // TODO Auto-generated constructor stub } public ReadWeather(Weather weather) { super(); this.weather = weather; } public Weather getWeather() { return weather; } public void setWeather(Weather weather) { this.weather = weather; } @Override public void run() { // TODO Auto-generated method stub for(int i = 0; i<100 ; i++) { weather.read(); System.out.println("第"+i+ "次读"); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
测试代码及输出:
package com.imooc.thread; public class WeatherTest { public static void main(String[] args) { // TODO Auto-generated method stub Weather weather = new Weather(); Thread readWeather = new Thread(new ReadWeather(weather)); Thread geneWeather = new Thread(new GenerateWeather(weather)); readWeather.start(); geneWeather.start(); } }
输出:
Generate Weather feature : Weather data [temperature=56, humidity=2]
第0次读
第0次写
read Weather feature : Weather data [temperature=56, humidity=2]
第1次写
第1次读
Generate Weather feature : Weather data [temperature=32, humidity=34]
第2次写
第2次读
read Weather feature : Weather data [temperature=32, humidity=34]
第3次读
Generate Weather feature : Weather data [temperature=59, humidity=19]
第3次写
read Weather feature : Weather data [temperature=59, humidity=19]
Generate Weather feature : Weather data [temperature=86, humidity=35]
第4次写
第4次读
read Weather feature : Weather data [temperature=86, humidity=35]
第5次读
Generate Weather feature : Weather data [temperature=70, humidity=19]
第5次写
read Weather feature : Weather data [temperature=70, humidity=19]
第6次写
第6次读
Generate Weather feature : Weather data [temperature=32, humidity=29]
第7次读
第7次写
read Weather feature : Weather data [temperature=32, humidity=29]
第8次写
第8次读
Generate Weather feature : Weather data [temperature=4, humidity=5]
第9次读
正在回答
两个线程的执行顺序就是随机的。但作业要求是,你增加逻辑代码后,不要让它随机,让它固定下来。先产生天气数据再读取天气数据。所以你看你加了flag后Generate Weather feature :与read Weather feature顺序是固定的。你无法固定线程顺序,但你可以固定线程中某代码的执行顺序呀,这不就达到目的了嘛。祝:学习愉快
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星