码迷,mamicode.com
首页 > 编程语言 > 详细

线程的等待与唤醒,实现if...else里面的值交互依次输出

时间:2019-10-24 23:55:34      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:new   span   private   als   not   while   jpg   完成   实现   

线程通信原理图:

技术图片

 


 

  • 资源类:
package com.yonyou.sci.gateway.exec.threadnet;

public class Resource {
     String name;
     String sex;
     // 用于表示赋值后的成员变量值有没有被输出 或 赋值成功
     boolean flag = false;
}
  • 成员变量赋值类:
package com.yonyou.sci.gateway.exec.threadnet;

public class Input implements Runnable {

    private Resource r;

    public Input (Resource r) {
        this.r = r;
    }

    @Override
    public void run () {
        int i = 0;
        while (true) {
            synchronized (r) {
                // 如果 flag 为 true 说明变量 name、sex 已经成功赋值,还没有被输出
                if (r.flag) {
                    try {
                        r.wait();
                    }catch (Exception e){};
                }
                else {
                    if (i%2 == 0) {
                        r.name = "张三";
                        r.sex = "男";
                    }
                    else {
                        r.name = "xiaohong";
                        r.sex = "girl";
                    }
                    // 给变量 name、sex 赋值完成后,把 falg 标识更改为true
                    r.flag = true;
                    i++;
                    // 唤醒线程
                    r.notify();
                }
            }
        }
    }

}
  • 打印成员变量值:
package com.yonyou.sci.gateway.exec.threadnet;

public class Output implements Runnable {
    private Resource r;

    public Output (Resource r) {
        this.r = r;
    }

    @Override
    public void run () {
        while (true){
            synchronized (r){
                // 如果 flag 为 false 说明变量 name、sex 没有被赋值,等待变量赋值
                if (!r.flag) {
                    try{
                        r.wait();
                    }catch (Exception e){
                        e.getMessage();
                    };
                }
                else {
                    System.out.println(r.name+"........"+r.sex);
                    r.flag = false;
                    r.notify();
                }
            }
        }

    }
}
  • 启动线程类:
package com.yonyou.sci.gateway.exec.threadnet;

public class mainResource {
    public static void main(String[] args) {
        Resource r = new Resource();

        Input i = new Input(r);
        Output o = new Output(r);

        Thread t1 = new Thread(i);
        Thread t2 = new Thread(o);

        t1.start();t2.start();

    }
}

 

线程的等待与唤醒,实现if...else里面的值交互依次输出

标签:new   span   private   als   not   while   jpg   完成   实现   

原文地址:https://www.cnblogs.com/tangshengwei/p/11735632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!