JAVA basics multi-threaded communication

Create an application that simulates the functionality of generating and distributing weather information.

need:

  1. Weather information includes temperature and humidity
  2. Generate temperature and humidity data and print them out

Use one thread to generate weather data and save it to the weather class, while using another thread to read the weather data and print it out.

Problems encountered during development:

  1. Data will be generated multiple times. Since the order and time of thread execution are not fixed, in order to ensure that generating data and reading data can be completed alternately, it is necessary to ensure synchronization between the two threads.

weather class:

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 + "]";
	}
	
	
}

Generate weather date thread class:

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

Read the weather data class:

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

Test class:

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

}

operation result:

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]

Guess you like

Origin blog.csdn.net/x1987200567/article/details/109220556