老师我想请教下如何实现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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
不知一下思路是否正确,结果如图
设置了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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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