java-资源类以及等待和唤醒

本文介绍Java中多线程间的协作机制,通过wait和notify方法实现线程间的等待和唤醒。具体展示了如何利用这些方法在一个简单的输入输出示例中进行线程同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 多线程之间需要协调工作:如果条件不满足,则等待;当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。等待机制与锁机制是密切关联的
  • wait():
    等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。
    调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。
  • notify():
    唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)
  • notifyAll():
    唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的
  • wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能。因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。
package com.Thread.Demo2;

public class ThreadTest {
    public static void main(String[] args) {
        ResourcesDemo r = new ResourcesDemo();
        Input in =new Input(r);
        Output out = new Output(r);
        Thread tin = new Thread(in);
        Thread tout = new Thread(out);
        tin.start();
        tout.start();
    }
}
package com.Thread.Demo2;
/*
 * 定义资源类,有2个成员变量
 * name,sex
 * 同时有两个线程,对资源中的变量操作
 * 
 */
public class ResourcesDemo {
    public String name;
    public String sex;
    public boolean flag=false;
}
package com.Thread.Demo2;
/*
 * 输入的的线程,对资源对象Resource中的成员变量赋值
 * 
 */
public class Output implements Runnable{
    private ResourcesDemo r;
    public Output(ResourcesDemo 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();
          }
        }
    }
}
package com.Thread.Demo2;

import javax.annotation.Resource;

/*
 * 输入的的线程,对资源对象Resource中的成员变量赋值
 * 
 */
public class Input implements Runnable{
    private ResourcesDemo r;
    public Input(ResourcesDemo r) {
        this.r=r;
    }
    public void run()
    {
        int i =0;
        while(true)
        {
            synchronized(r)
            {
                //标记true是等待
                if(r.flag) {
                    try {
                        r.wait();
                    }catch(Exception e){

                    }
                }
                if(i%2==0) {
                    r.name="张三";
                    r.sex="男";
                }else {
                    r.name = "lisi";
                    r.sex = "nv";
                }
                r.flag=true;
                r.notify();
            }
            i++;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值