加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

java多线程――线程间通信之线程等待唤醒机制

发布时间:2020-12-13 20:06:43 所属栏目:PHP教程 来源:网络整理
导读:3个方法 wait() notify() notifyAll() 3个方法都使用在同步中,由于要对持有锁(又叫监控)的线程操作。 所以要使用在同步中,由于只有同步才具有锁。 为何这些操作线程的方法均出现在Object类中? 由于这些方法在操作同步中的线程时候,都必须要标识所操作线
  • 3个方法
    wait()
    notify()
    notifyAll()
    3个方法都使用在同步中,由于要对持有锁(又叫监控)的线程操作。
    所以要使用在同步中,由于只有同步才具有锁。
  • 为何这些操作线程的方法均出现在Object类中?
    由于这些方法在操作同步中的线程时候,都必须要标识所操作线程识有锁。只有同1个锁上的被等待的线程,可以被同1个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。
    也就是说,等待和唤醒必须是同1个锁。
public class Demo1 { public static void main(String[] args) { Res res = new Res(); Input i = new Input(res); Output o = new Output(res); Thread t1 = new Thread(i); Thread t2 = new Thread(o); t1.start(); t2.start(); } } class Res { private String name; private String gender; private boolean flag; public synchronized void setNameGender(String name,String gender) { if (flag) try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.name = name; this.gender = gender; this.flag = true; this.notify(); } public synchronized void out() { if (!this.flag) try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name + " : " + this.gender); this.flag = false; this.notify(); } } class Input implements Runnable { private Res res; Input(Res res) { this.res = res; } public void run() { int x = 0; while (true) { if (x % 3 == 0) { res.setNameGender("T-mac","male"); } else if (x % 3 == 1) { res.setNameGender("麦迪","男人"); } else { res.setNameGender("CBA","糟"); } x++; } } } class Output implements Runnable { private Res res; Output(Res res) { this.res = res; } public void run() { while (true) { res.out(); } } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读