学习了Java多线程的知识以后,我们编写一个应用程序来读取天气数据。即,模拟通过大气温度传感器来获取温度和湿度等天气数据。
很多家庭都有温湿度计,它实际上是通过大气温度传感器来获取温度和湿度信息,并显示在表盘中的。而我们要做的程序就是模拟这个过程,生成天气数据,然后显示出来。
需求分析:
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 public class GenerateWeather implements Runnable{ 2 Weather wea; 3 4 public GenerateWeather(Weather wea) { 5 this.wea = wea; 6 } 7 8 @Override 9 public void run() { 10 for (int i=0;i<100;i++) { 11 wea.generate(); 12 try { 13 Thread.sleep(5000); 14 } catch (InterruptedException e) { 15 // TODO Auto-generated catch block 16 e.printStackTrace(); 17 } 18 } 19 20 } 21 22 }
1 public class Weather { 2 private int temperatrue; 3 private int humidity; 4 private boolean flag = false; 5 6 public int getTemperatrue() { 7 return temperatrue; 8 } 9 public void setTemperatrue(int temperatrue) { 10 this.temperatrue = temperatrue; 11 } 12 public int getHumidity() { 13 return humidity; 14 } 15 public void set Humidity(int humidity) { 16 this.humidity = humidity; 17 } 18 19 public synchronized void generate() { 20 if(flag) { 21 wait(); 22 } catch (InterruptedExceptuin e) { 23 e.printStackTrace(); 24 } 25 } 26 setTemperatrue((int)(Math.random()*40)); 27 setHumidity((int)(Math.random()*100)); 28 System.out.println("生成天气数据"+toString()); 29 flag = true; 30 notifyAll(); 31 } 32 33 public synchronized void read (){ 34 if(!flag){ 35 try { 36 wait(); 37 }catch (InteruptedException e ){ 38 e.printStackTrace(); 39 } 40 } 41 System.out.println(""+toString()); 42 flag = false; 43 notifyAll(); 44 } 45 46 @Override 47 public String toString() { 48 return "[温度:" + temperatrue + ", 湿度:" + humidity+ "]"; 49 } 50 51 }
1 public class ReadWeather implements Runnable{ 2 Weather wea; 3 4 public ReadWeather(Weather wea) { 5 this.wea = wea; 6 } 7 8 @Override 9 public void run() { 10 for (int i=0;i<100;i++) { 11 wea.read(); 12 try { 13 Thread.sleep(100); 14 } catch (InterruptedException e) { 15 // TODO Auto-generated catch block 16 e.printStackTrace(); 17 } 18 } 19 } 20 }
1 public class WeatherTest { 2 3 public static void main(String[] args) { 4 Weather wea = new Weather(); 5 new Thread(new GenerateWeather(wea)).start(); 6 new Thread(new ReadWeather(wea)).start(); 7 8 } 9 10 }
public
class
GenerateWeather
implements
Runnable{
Weather wea;
public
GenerateWeather(Weather wea) {
this
.wea = wea;
}
@Override
public
void
run() {
for
(
int
i=
0
;i<
100
;i++) {
wea.generate();
try
{
Thread.sleep(
5000
);
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}