5-3

学习了Java多线程的知识以后,我们编写一个应用程序来读取天气数据。即,模拟通过大气温度传感器来获取温度和湿度等天气数据。

很多家庭都有温湿度计,它实际上是通过大气温度传感器来获取温度和湿度信息,并显示在表盘中的。而我们要做的程序就是模拟这个过程,生成天气数据,然后显示出来。

需求分析:

1、设计一个天气类Weather,用于温度和湿度数据的存放和读取。

2、设计一个线程类GenerateWeather,用于生成天气数据。模拟生成100次天气数据,每次生成天气数据需要5秒的时间。

3、设计一个线程类ReadWeather,用于读取天气数据。模拟读取100次天气数据,每次读取数据需要0.1秒的时间。

4、设计一个测试类WeatherTest,模拟生成和读取数据的过程,要求实现生成一次,紧接着进行读取,不能出现不同步的情况。

5-3

 

 

 

详细设计:

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();             }         }               }   }
上一篇:java学习----枚举和注解


下一篇:LeetCode(数据库)- 不同国家的天气类型