线程间通讯(等待唤醒机制)

锁.whit(); //将线程丢进线程池,暂停运行。
锁.notify(); //唤醒线程池中的最先存入那个同锁线程
锁.notifyAll(); //唤醒线程池中所有的同锁线程

都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。

为什么这些操作线程的方法要定义Object类中
因为这些方法在操作同步中线程时,都需要标识它们所操作线程持有的锁
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。
不可以对不同锁中的线程进行唤醒。

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

而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object类中。

class Res{
    String name;
    String sex;
    boolean flag=false;
}
class Input implements Runnable{
    private Res r;
    Input(Res r){
        this.r=r;
    }
    public void run(){
        int x=0;
        while(true){
            synchronized(r){
                if(r.flag){
                    try{
                        r.wait();
                    }
                    catch(Exception e){}
                }
                if(x==0){
                    r.name="丽丽";
                    r.sex="女";
                }else{
                    r.name="lisi";
                    r.sex="nan";
                }
                x=(x+1)%2;
                r.flag=true;
                r.notify();
            }
        }
    }
}
class Output implements Runnable{
    private Res r;
    Output(Res r){
        this.r=r;
    }
    public void run(){
        while(true){
            synchronized(r){
                if(!r.flag){
                    try{
                        r.wait();
                    }
                    catch(Exception e){}
                }
                System.out.println(r.name+"...."+r.sex);
                r.flag=false;
                r.notify();
            }
        }
    }
}
class Test{
    public static void main(String[] args){
        Res r=new Res();
        Input a=new Input(r);
        Output b=new Output(r);
        Thread t1=new Thread(a);
        Thread t2=new Thread(b);
        t1.start();
        t2.start();
    }
}

  

时间: 2024-12-24 08:17:23

线程间通讯(等待唤醒机制)的相关文章

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

线程间通信——等待唤醒机制,避免争夺同一资源: 锁对象可以是任意Object类的子类对象: 包子案例: 包子案例——生产者和消费者: 代码实现: 关键就是在于两个线程使用同一个锁对象! 这边是主程序调用这两个线程时候传入的同一个对象! 包子铺线程类——生产者: 其中,baozi类作为成员变量,并且重载了带参的构造方法: 锁对象为调用包子铺带参的构造方法传入的这个包子变量bz; 调用点wait方法必须是锁对象调用,锁对象调用wait方法之后当前线程就进入等待状态,另外一个线程此时应该是正在执行:

JAVA-初步认识-第十四章-线程间通信-等待唤醒机制-代码优化

一. 上一节中的代码写的并不是很眼镜,如下图中的属性,应该都是私有的.我们不应该直接访问资源中的属性,是因为它具备了不安全性. 瞎赋值怎么办呢?为了可控,意味着资源里面的属性需要被私有化,并对外提供方法访问.因此上节中的代码要进行改写. 首先对资源描述类进行修改,至于为什么set方法中写有两个形参,是因为name和sex同时要做赋值,因此直接将它们定义在一起. 而且类中提供了直接输出name和sex的方法,后面的程序中就不需要写那么长的输出语句了.这个输出问题比较简单 关键问题在哪儿呢?如果这么

线程组、等待唤醒机制代码优化

线程组:ThreadGroup 把多个线程组合到一起,可以对一批线程进行分类处理,JAVA允许程序直接对线程进行控制 获取线程组:public final ThreadGroup getThreadGroup() 获取线程组的名称:public final String getName() 设置新的线程组:ThreadGroup(String name) 把线程弄到新线程组里:Thread(ThreadGroup group,Runnable target,String name) 等待唤醒机制

18、多线程 (线程安全、线程同步、等待唤醒机制、单例设计模式)

线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码. 程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 售票的案例 *A:售票的案例 /* - 多线程并发访问同一个数据资源 - 3个线程,对一个票资源,出售 */ public class ThreadDemo { public static void main(String[] args) { //创建Runnable接口实现

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

线程间的通讯: 事实上就是多个线程在操作同一个资源. 可是操作动作不同 样例: 需求:模拟简单卖票系统(输入一个人.紧接着输出一个人) 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

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

【线程间通信:等待唤醒机制】

在线程安全解决之后,还是一样存在着如下的问题: A:如果消费者先抢到CPU的执行权,就会去消费数据,但是现在的数据是默认值,没有意义,应该等着数据有意义,再消费. B:如果生产者先抢到CPU的执行权,就会去生产数据,但是呢,它生产完数据后,还继续拥有执行权,它又继续产生数据.这是有问题的,它应该等着消费者把数据消费掉,然后再生产. 正常的思路: A:生产者:先看是否有数据,有就等待,没有就生产,生产完后通知消费者来消费数据. B:消费者:先是是否有数据,有就消费,没有就等待,通知生产者生产数据.

Android-Java多线程通讯(生产者 消费者)&10条线程对-等待唤醒/机制的管理

上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 的基础上,扩大规模增加10条线程去执行 生产者 消费者: 注意:?? 上一篇博客是两条线程在执行(生产者 消费者)例如:当Thread-0 锁.wait(); 等待 冻结后,  Thread-1 锁.notify(); 唤醒的一定是 T

线程间的通信--等待唤醒机制

1.多个线程操作相同的资源,但是操作动作不同,所以存在安全问题例如: public class Test { public static void main(String[] args) { Resource r = new Resource(); Input in = new Input(r); Output out = new Output(r); Thread tin = new Thread(in); Thread tout = new Thread(out); tin.start();