5-3作业
模拟通过大气温度传感器来获取温度和湿度等天气数据.
任务描述
⼀、项⽬准备 开发⼯具:
JDK、Eclipse
需求分析:
1、设计⼀个天⽓类Weather,⽤于温度和湿度数据的存放和读取。
2、设计⼀个线程类GenerateWeather,⽤于⽣成天⽓数据。模拟⽣成100次天⽓数据,每次⽣成天⽓数据需要5秒的时 间。
3、设计⼀个线程类ReadWeather,⽤于读取天⽓数据。模拟读取100次天⽓数据,每次读取数据需要0.1秒的时间。
4、设计⼀个测试类WeatherTest,模拟⽣成和读取数据的过程,要求实现⽣成⼀次,紧接着进⾏读取,不能出现不同步的 情况。
详细设计:
1、天⽓类Weather,包含int类型的温度(temperature)和湿度(humidity)属性,以及布尔类型的属性flag⽤于判断是 ⽣成还是读取天⽓信息。 ⽅法包括:
(1) 温度和湿度属性的getter和setter⽅法
(2) ⽣成天⽓数据的⽅法public void generate()
使⽤随机数获取0-40度之间的温度,0-100之间的湿度
(3) 读取天⽓数据的⽅法public void read()
(4) 重写toString()⽅法
2、 ⽣成天⽓线程类GenerateWeather属性为Weather类的对象,包括构造⽅法和run⽅法。
3、 读取天⽓线程类ReadWeather 属性为Weather类的对象,包括构造⽅法和run⽅法。
4、 测试类WeatherTest 在主⽅法中模拟⽣成和读取数据的过程
三、实现代码
1.weather.java
public class Weather {
private int temperature;
private int humidity;
Boolean flag = false;
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() {
if(flag) {//如果已经生成了数据就等待
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.setTemperature((int)(Math.random()*40));
this.setHumidity((int)(Math.random()*100));
System.out.println("生成天气数据[温度:"+this.getTemperature()+",湿度:"+this.getHumidity()+"]");
flag=true;//表示已经生成了数据
notifyAll();
}
public synchronized void read() { //读取天气信息
if(!flag) {//如果没有任何数据则等待
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("读取天气数据[温度:"+this.getTemperature()+",湿度"+this.getHumidity()+"]");
flag=false;//表示数据痛完了
notifyAll();
}
}
2.GenerateWeather.java
public class GenerateWeather extends Thread {
Weather weather;
public GenerateWeather(Weather weather) {
this.weather=weather;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
for(int i=0;i<100;i++) {
weather.generate();//调用生成方法
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
3.ReadWeather.java
public class ReadWeather implements Runnable {
Weather weather;
public ReadWeather(Weather weather) {
this.weather = weather;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
for (int i = 0; i < 100; i++) {
weather.read();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
4.WeatherTest.java
public class WeatherTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Weather weather=new Weather();
new Thread(new GenerateWeather(weather)).start();
new Thread(new ReadWeather(weather)).start();
}
}