Object wait方法
2017-02-04 14:54
225 查看
概述
当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁。
但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务。在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码。等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,让线程A从等待状态变成执行状态,继续执行代码。
有些同学认为线程A也可以一直循环判断,检查条件是否已经满足,而不一定要中断自己,然后等待。其实这种也是一种思路,但是呢?比较耗CPU,而且也不知道条件何时才能满足。
线程之间要协调沟通,必须有一个等待机制和通知机制,在
Object的wait方法
如果想让线程A处于等待状态,可以调用当前对象
注意:
当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁。
但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务。在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码。等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,让线程A从等待状态变成执行状态,继续执行代码。
有些同学认为线程A也可以一直循环判断,检查条件是否已经满足,而不一定要中断自己,然后等待。其实这种也是一种思路,但是呢?比较耗CPU,而且也不知道条件何时才能满足。
线程之间要协调沟通,必须有一个等待机制和通知机制,在
JAVA里面,对应的就是
wait方法和
notify方法。
Object的wait方法
synchronized (obj) { while (condition does not ok){ obj.wait(); } }
如果想让线程A处于等待状态,可以调用当前对象
wait方法。wait方法一旦被调用,也就意味着:线程A已经获得锁了,而且能做的事情都已经做了,现在只能等待了,等待另外的同步操作执行某些代码后,我才回来继续干活。
注意:
wait方法是定义在根类
Object上的,Thread继承自
Object类,自然也有
wait方法。但是这里并不是调用当前线程对象的
wait方法,而是具有锁属性的当前对象的
wait方法;这一点我也不太理解,我觉得要做到线程A切换到等待状态,之后被人唤醒,就算使用线程A的
wait方法和
notify方法其实也是可以做到的,但是估计实现起来非常麻烦。另外从场景上看,
wait定义在
Object也比较合理,表示线程挂在了对象的等待池中。
相关文章推荐
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects) --代替方法:MsgWaitForMultipleObjects
- 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)
- 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等
- Java Object.wait()方法
- java.lang.Object 的 wait 和 notify方法,及关键字 synchronized的作用
- 多线程访问文件问题中WaitForSingleObject方法的使用,及其效率!
- java.lang.Thread.sleep()方法和java.lang.Object.wait()方法之间的区别
- java object的wait和Thread的sleep方法区别
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Java中的Object的Wait() 和notify()方法使用时应注意的地方
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects) --代替方法:MsgWaitForMultipleObjects
- Java中的Object的Wait() 和notify()方法使用时应注意的地方
- java object的wait和Thread的sleep方法区别
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解
- ThreadPool.QueueUserWorkItem 方法 (WaitCallback, Object)
- 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- ThreadPool.RegisterWaitForSingleObject使用方法 推荐
- Object的Wait() 和notify()方法使用
- Thread的join()方法和Object的wait(),notify(),notifyAll()方法