老师我想请教下如何实现2个以上线程同步数据,

老师我想请教下如何实现2个以上线程同步数据,

我两个线程我可以控制一次两条的打印,三个线程就不行了,就会跑乱,麻烦老师给我思想解答。

http://img1.sycdn.imooc.com//climg/5eb956b709e42b4f05530522.jpg

http://img1.sycdn.imooc.com//climg/5eb956b709ee84f005530229.jpg


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
holder姐 2020-05-21 11:43:20
/**
不知一下思路是否正确,结果如图
设置了flag通信标识为数字,1是设置数据 2-读取数据,3-猜测数据,
是按设置-读取-猜测-设置-读取-猜测  这样依次获取资源的

然后增加了GuessWeather类,主方法启动了三个线程
new Thread(new GenerateWeather(weather)).start();
new Thread(new ReadWeather(weather)).start();
new Thread(new GuessWeather(weather)).start();
*/
public class Weather {
	private int temp;//温度
	private int hum;//湿度
	private int flag = 1;//生成后才能读取  读取完才能继续下一次生成 1-生成 2-读取 3-猜测
	public Weather() {	
	}
	public int getTemp() {
		return temp;
	}
	public void setTemp(int temp) {
		this.temp = temp;
	}
	public int getHum() {
		return hum;
	}
	public void setHum(int hum) {
		this.hum = hum;
	}
	//生成天气
	public synchronized void generate() {
		if(flag == 1) {
			notifyAll();
			setTemp((int) (Math.random()*40));
			setHum((int) (Math.random()*100));
			System.out.println("生成天气数据 [温度=" + temp + ", 湿度=" + hum + "]");
			flag = 2;
		}else{
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	//读取天气
	public synchronized void read() {
		if(flag == 2) {
			notifyAll();
			System.out.println(this.toString());
			flag = 3;
		}else {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	//猜测天气
	public synchronized void guess() {
		if(flag == 3) {
			notifyAll();
			System.out.println("猜测天气数据 [温度=" + temp + ", 湿度=" + hum + "]");
			flag = 1;
		}else {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	//读取天气信息
	@Override
	public String toString() {
		return "读取天气数据 [温度=" + temp + ", 湿度=" + hum + "]";
	}
	
	
}

http://img1.sycdn.imooc.com//climg/5ec5f72e0947dbe404480794.jpg

好帮手慕雪 2020-05-13 09:57:04

http://img1.sycdn.imooc.com//climg/5ebb53b3090c989205000677.jpg

1)num 的初值为0;2)4个框分别改为if(num != 0) ,if(num!=1) 和if(num!=2) ,num =0;


  • 提问者 慕神4071666 #1
    //生成天气的方法 public synchronized void generate() { if(num!=0) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Random r = new Random(); int temperature = r.nextInt(40); int humidity = r.nextInt(100); this.setTemperature(temperature); this.setHumidity(humidity); System.out.println("生成天气数据:[温度:"+this.getTemperature()+ "湿度:"+this.getHumidity()+"]"); num = 1; notifyAll(); } //读取天气的方法 public synchronized void read() { if(num!=1) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } num =2; System.out.println("读取天气数据:[温度:"+this.getTemperature()+ "湿度:"+this.getHumidity()+"]"); notifyAll(); } //猜测天气的线程 public synchronized void read2() { if(num!=2) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } num =0; System.out.println("猜测天气数据:[温度:"+this.getTemperature()+ "湿度:"+this.getHumidity()+"]"); notifyAll(); }
    2020-05-13 19:14:23
  • 提问者 慕神4071666 #2
    生成天气数据:[温度:22湿度:42] 读取天气数据:[温度:22湿度:42] 猜测天气数据:[温度:22湿度:42] 生成天气数据:[温度:10湿度:72] 猜测天气数据:[温度:10湿度:72] 读取天气数据:[温度:10湿度:72] 猜测天气数据:[温度:10湿度:72] 生成天气数据:[温度:0湿度:75] 猜测天气数据:[温度:0湿度:75] 读取天气数据:[温度:0湿度:75] 猜测天气数据:[温度:0湿度:75] 生成天气数据:[温度:16湿度:70] 读取天气数据:[温度:16湿度:70] 生成天气数据:[温度:5湿度:37] 读取天气数据:[温度:5湿度:37]
    2020-05-13 19:15:02
  • 提问者 慕神4071666 #3
    老师请看代码是按照你的要求改的,num初始值为0
    2020-05-13 19:15:48
好帮手慕雪 2020-05-12 09:47:50

第三个方法read2()是什么意思?这个方法不需要,删除它。上面两个方法都写在天气这个类里,不管你有几个线程,都是调用的这两个方法来生成和读取天气的。祝:学习愉快

  • 提问者 慕神4071666 #1
    read2方法我是想多做一个猜测天气的方法,然后线程掉用,生成天气,读取天气,猜测天气。按这个顺序来执行显示,可是三个线程按老师教给的知识无法实现,所以请教老师,思路。
    2020-05-12 14:33:48
  • 好帮手慕雪 回复 提问者 慕神4071666 #2
    这就像是“剪刀,石头,布”游戏一样,你需要让它形成一个闭环。1)num 的初值为0;2)修改三个方法的if判断,分别改为if(num != 0) ,if(num!=1) 和if(num!=2) 。 3)产生闭环,read2()要num =0;而不是num =3
    2020-05-12 14:58:07
  • 提问者 慕神4071666 #3
    //生成天气的方法 public synchronized void generate() { if(num!=0) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Random r = new Random(); int temperature = r.nextInt(40); int humidity = r.nextInt(100); this.setTemperature(temperature); this.setHumidity(humidity); System.out.println("生成天气数据:[温度:"+this.getTemperature()+ "湿度:"+this.getHumidity()+"]"); flag = true; num = 0; num1=1; notifyAll(); } //读取天气的方法 public synchronized void read() { if(num!=1) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } flag = false; num =1; num1=3; System.out.println("读取天气数据:[温度:"+this.getTemperature()+ "湿度:"+this.getHumidity()+"]"); notifyAll(); } //猜测天气的线程 public synchronized void read2() { if(num!=2) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } flag = false; num =2; num1=2; System.out.println("猜测天气数据:[温度:"+this.getTemperature()+ "湿度:"+this.getHumidity()+"]"); notifyAll(); }
    2020-05-12 19:52:31
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师