创建一个模拟产生和发布天气信息功能的应用。
需求:
- 天气信息中包含温度和湿度
- 生成温度和湿度的数据,并将其打印出来
采用一个线程生成天气数据,并保存到weather类中,同时用另外一个线程读取天气数据并将其打印出来。
开发过程中遇到的问题:
- 会出现多次产生数据由于线程执行的顺序和时间都是不固定的,所以为了保证生成数据和读取数据能交替完成,需要保证两个线程之间的同步。
weather类:
package com.threadcommunicate;
public class Weather {
private int temperature;
private int humidity;
// flag = false ,生成数据;flag = true, 读取数据
boolean flag = false;
public synchronized void getweatherData() {
if(!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = false;
notifyAll();
System.out.println("Read Weather data:" + this.toString());
}
public synchronized void setweatherData(int temperature,int humidity) {
if(flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.setTemperature(temperature);
this.setHumidity(humidity);
flag = true;
System.out.println("Generate Weather data:" + this.toString());
notifyAll();
}
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;
}
@Override
public String toString() {
return "Weather [temperature=" + temperature + ", humidity=" + humidity + "]";
}
}
生成weather date线程类:
package com.threadcommunicate;
import java.util.Random;
public class GenerateWeather implements Runnable {
Weather weather;
public GenerateWeather(Weather weather) {
this.weather = weather;
}
public void generate() {
int temp = new Random().nextInt(40);
int hum = new Random().nextInt(100);
weather.setweatherData(temp, hum);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
generate();
}
}
}
读取weather data类:
package com.threadcommunicate;
public class ReadWeather implements Runnable{
Weather weather ;
public ReadWeather(Weather weather) {
this.weather = weather;
}
public void read() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
weather.getweatherData();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
read();
}
}
}
测试类:
package com.threadcommunicate;
public class Test {
public static void main(String[] args) {
Weather w = new Weather();
new Thread(new GenerateWeather(w)).start();
new Thread(new ReadWeather(w)).start();
}
}
运行结果:
Generate Weather data:Weather [temperature=18, humidity=45]
Read Weather data:Weather [temperature=18, humidity=45]
Generate Weather data:Weather [temperature=30, humidity=41]
Read Weather data:Weather [temperature=30, humidity=41]
Generate Weather data:Weather [temperature=10, humidity=29]
Read Weather data:Weather [temperature=10, humidity=29]
Generate Weather data:Weather [temperature=37, humidity=51]
Read Weather data:Weather [temperature=37, humidity=51]
Generate Weather data:Weather [temperature=7, humidity=22]
Read Weather data:Weather [temperature=7, humidity=22]
Generate Weather data:Weather [temperature=5, humidity=93]
Read Weather data:Weather [temperature=5, humidity=93]
Generate Weather data:Weather [temperature=20, humidity=30]
Read Weather data:Weather [temperature=20, humidity=30]
Generate Weather data:Weather [temperature=8, humidity=27]
Read Weather data:Weather [temperature=8, humidity=27]
Generate Weather data:Weather [temperature=8, humidity=56]
Read Weather data:Weather [temperature=8, humidity=56]
Generate Weather data:Weather [temperature=33, humidity=61]
Read Weather data:Weather [temperature=33, humidity=61]
Generate Weather data:Weather [temperature=2, humidity=37]
Read Weather data:Weather [temperature=2, humidity=37]
Generate Weather data:Weather [temperature=37, humidity=15]
Read Weather data:Weather [temperature=37, humidity=15]
Generate Weather data:Weather [temperature=9, humidity=30]