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

  • 三个方法

    wait()

    notify()

    notifyAll()

    三个方法都使用在同步中,因为要对持有锁(又叫监控)的线程操作。

    所以要使用在同步中,因为只有同步才具有锁。

  • 为什么这些操作线程的方法均出现在Object类中?

    因为这些方法在操作同步中的线程时候,都必须要标识所操作线程识有锁。只有同一个锁上的被等待的线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。

    也就是说,等待和唤醒必须是同一个锁。

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();
        }
    }
}
时间: 2024-11-05 18:51:59

java多线程——线程间通信之线程等待唤醒机制的相关文章

Java笔记七.线程间通信与线程生命的控制

线程间通信与线程生命的控制 一.线程通信方法 Java是通过Object类的wait.notify.notifyAll这几个方法来实现进程键的通信.由于所有的类都是从Object继承的,因此在任何类中都可以直接使用这些方法. wait:告诉当前线程放弃监视器并进入睡眠状态,知道其他线程进入同一监视器并调用notify为止; notify:唤醒同一对象监视器中调用wait的第一个线程.用于类似饭馆有一个空位后通知所有等候就餐的顾客中的第一位可以入座的情况: notifyAll:唤醒同一对象监视器中

黑马程序员——JAVA基础之Day24 多线程 ,死锁,线程间通信 ,线程组,线程池,定时器。

------- android培训.java培训.期待与您交流! ---------- Lock()实现提供了比使用synchronized方法和语句可获得更广泛的锁定操作. private Lock lock =new ReentrantLock(); 被锁的代码要用   lock.lock()                lock.unlock()    包括.其中用try   ...finally包围 同步:效率低,如果出现同步嵌套,会出现死锁.  但是安全. 死锁问题:两个或者两个以上

线程间通信和线程互斥

线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后在主线程刷新UI界面 视图布局我就不写了,大家自己来吧,线程间通信代码如下: #pragma mark - 添加响应方法触发创建子线程并加载数据 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

Java——线程锁,死锁,等待唤醒机制

一.线程锁 线程安全问题 p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; text-align: justify; widows: 0; orphans: 0 } p.western { font-family: "Calibri", sans-serif; font-size: 10pt } p.cjk { font-family: "宋体"; font-s

Java多线程(一)同步与等待唤醒

 1:数据安全问题 1.1:什么情况下会出现数据安全问题? 多个线程对同一个资源进行操作,并且操作资源的语句有多条.那么这个时候这些语句因为cpu的随机性,有可能被多个线程分开执行.导致数据安全问题. 例子:有3个人分别是你爸.你妈妈.你姐,去你的一个账户汇钱给你,每一个只能存3次,一次只能存100元.每存一次,请打显示出账户里的余额.代码体现: 1 public class SaveMoneyDemo1 { 2 3 public static void main(String[] args)

多线程间的通讯之等待唤醒机制

线程间的通讯: 事实上就是多个线程在操作同一个资源. 可是操作动作不同 样例: 需求:模拟简单卖票系统(输入一个人.紧接着输出一个人) class Res { String name; String sex; } class Input implements Runnable { private Res r; private int t=0; Input(Res r) { this.r=r; } public void run() { while(true) { if(t==1) { r.nam

2. GCD的使用(线程间通信---子线程执行耗时操作/主线程更新UI)

// // ViewController.m // 07-线程间通信(加载图片,在主线程中更新UI) // // Created by Jasperay on 15/9/3. // Copyright (c) 2015年 @aLonelyRoot3. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UI

线程的几个主要概念----线程间通信;线程死锁;线程控制:挂起、停止和恢复(线程同步的5种方式)

(一)线程同步(5种同步方式) 1.同步方法--->有synchronized关键字修饰的方法.(Java的每个内置对象都有一个内置锁,当用synchronized修饰方法--->内置锁保护整个方法) 在调用该方法前,需要获得内置锁,否则就处于阻塞状态. eg: public  synchronized  void  save(){     } [注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类.] 2.同步代码块:--->有synchron

Java 里如何实现线程间通信

正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了.本文涉及到的知识点:thread.join(), object.wait(), object.notify(), CountdownLatch, CyclicBarrier, FutureTask, Callable 等. 下面我从几个例子作为切入点来讲解下 Java 里有哪些方法来实现线程间通信. 如何让两个线程依次执行? 那如何让 两个线程按照指定方式有序交叉运