老师,为啥我这么写有问题呢?
来源:5-3 自由编程
热爱编程学习
2022-03-14 01:05:55
package com.imooc.weather; public class WeatherTest { public static void main(String[] args) { // TODO Auto-generated method stub Weather w=new Weather(); GenerateWeather g=new GenerateWeather(w); ReadWeather r=new ReadWeather(w); Thread t1=new Thread(g); Thread t2=new Thread(r); t1.start(); t2.start(); } } package com.imooc.weather; public class Weather { private int temperature; private int humidity; private boolean flag=false; public Weather() {} public Weather(int temperature, int humidity) { super(); this.temperature = temperature; this.humidity = humidity; //this.flag = flag; } 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 synchronized void generate() { int n=0,y=0; if(!flag) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } n=(int)(Math.random()*40); setTemperature(n); y=(int)(Math.random()*100); setHumidity(y); } System.out.println("生成"+n+"天气"+y+"温度"); flag=false; notifyAll(); } public synchronized void read() { if(flag) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("读取"+getTemperature()+"天气"+getHumidity()+"温度"); flag=true; notifyAll(); } //System.out.println("读取"+getTemperature()+"天气"+getHumidity()+"温度"); //getTemperature(); //getHumidity(); } @Override public String toString() { return "温度: " + temperature + "湿度:" + humidity; } } package com.imooc.weather; public class ReadWeather implements Runnable{ Weather weather; public ReadWeather(Weather weather) { super(); this.weather = weather; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<20;i++) { weather.read(); } } } package com.imooc.weather; public class GenerateWeather implements Runnable{ Weather weather; public GenerateWeather(Weather weather) { super(); this.weather = weather; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<20;i++) { weather.generate(); } } }
1回答
同学你好,同学代码的运行流程如下:
一、启动程序之后,有两种执行的可能:
1.先执行read线程,此时代码中的flag为false,略过if代码,什么都不做
2.先执行generate线程,此时此时代码中的flag为false,进入if代码块,执行wait,线程进入等待。
二、由上面分析可知:
1.如果先执行第二种情况,generate线程进入wait状态,此时会不断执行read线程直至20次read执行结束,程序阻塞在generate线程中。由于同学的代码中read线程没有任何输出,所以仅能看到程序没有终止,是因为generate线程还在阻塞、
2.如果先执行第一种情况,read线程线程的代码什么都不做,继续下一次线程选择。任何情况下,只要选择到read线程都会什么都不做,但是一旦选择到generate线程,就会发生上面的情况。
综上所述,同学代码中存在严重的逻辑错误,建议同学复习并深刻理解之后重新编码。
祝学习愉快~
相似问题