気象情報を生成および配信する機能をシミュレートするアプリケーションを作成します。
必要:
- 気象情報には気温と湿度が含まれます
- 温度と湿度のデータを生成し、印刷する
1 つのスレッドを使用して気象データを生成し、それを天気クラスに保存し、別のスレッドを使用して気象データを読み取って出力します。
開発中に遭遇した問題:
- データは複数回生成されますが、スレッドの実行順序や実行時間は固定されていないため、データの生成とデータの読み出しを交互に完了させるためには、2つのスレッド間の同期を確保する必要があります。
天気クラス:
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 + "]";
}
}
天気予報の日付スレッド クラスを生成します。
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();
}
}
}
気象データ クラスを読み取ります。
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]