使用对象去暂停或锁住一个线程的方式

本文详细介绍了如何使用Java对象锁机制实现线程的暂停与唤醒功能,包括全局对象的定义、线程等待与唤醒的具体实现步骤,以及注意事项如同步块的使用、多个线程等待、notify与notifyAll的区别等。

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

引入问题:

需求:  有时候需要 锁住 或 暂停 运算线程, 需要等待外部事件   或者  等待固定时长  后唤醒和恢复工作。


实现方式有: (1)使用  Thread.sleep(2000)  方式让线程直接睡下去,并在固定时长后自动唤醒。

 (2)使用对象锁实现,在其他线程唤醒此对象。


注: 两者是有很大区别的。第(1)种实现方式是线程直接睡,不出让系统资源。相反第(2)种线程就会出让系统资源。   此文只记录第(2)种方式实现。



实现(2)方式:

java每个对象都会有wait()\notify()等的方法。用这个可以实现锁住,并暂停在锁位置。 所在线程有此对象锁, 线程也会被锁,实质不是锁上,线程会出让系统资源。即线程因为此对象的等待而不工作。

可以等待固定时间; 可以用其他线程执行  notify()来唤醒此对象,即唤醒此线程。


(1)全局对象,用于标志等待和唤醒。

    private Object mLockFlagObject = new Object();



(2)在工作线程中,想要暂停的位置执行此等待,等待别的线程来唤醒此对象。

                        synchronized (mLockFlagObject) {
                            mLockFlagObject.wait();
                        }


(3)在其他线程中执行notify()唤醒此对象,从而工作线程等待解除。

        synchronized (mLockFlagObject) {
            mLockFlagObject.notifyAll();
        }


注: 

(1)需要加上synchronized (mLockFlagObject) { } 这个来获取到mLockFlagObject的锁域,即监视器。否则会报错误如:java.lang.IllegalMonitorStateException

(2)多个线程可以同时在一个对象上等待。

(3)notify()是随机唤醒一个在对象上等待的线程, 若没有等待的线程,则不做任何操作。

(4)notifyAll()是唤醒等待池中的所有对象。

(5)notify()唤醒线程,并不是在notify()执行以后立即唤醒,而是在notify()线程释放了对象监视器后才真正执行被唤醒的线程。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卜溪大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值