Java 多线程模拟天气数据读取

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();
	}

}

参考:https://blog.csdn.net/rainary/article/details/72714350

发布了90 篇原创文章 · 获赞 50 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_40307919/article/details/104445367