老师,为啥我这么写有问题呢?
来源: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线程,就会发生上面的情况。
综上所述,同学代码中存在严重的逻辑错误,建议同学复习并深刻理解之后重新编码。
祝学习愉快~
相似问题