java线程的notify
① java多线程suspend,resume和wait,notify的区别
suspend,使线程进入停滞状态,除非收到resume消息,否则该线程不会变回可执行状态。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方 法要捕捉InterruptedException异常;
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候, 并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且 不是按优先级;
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一 个对象的锁,而是让它们竞争。
② java线程中notify什么意思
每个对象都有一个监视器,wait和notify都必须针对同一个监视器,
Student中notify是通知在this上等待的线程,wait是让出this的监视器,等待其它线程在this上的通知
Teacher中wait是等待其它线程在this上的通知,而且也没有通知其它线程,与Student不对应
大致代码如下:
Student:
synchronized(Test.class)
{
while(true)
{
//do....
Test.class.notify();
Test.class.wait();
}
}
Teacher:
synchronized(Test.class)
{
Test.class.wiat();
//do....
Test.class.nofity();
}
③ JAVA多线程suspend,resume和wait,notify的区别
suspend,使线程进入停滞状态,除非收到resume消息,否则该线程不会变回可执行状态。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方
法要捕捉InterruptedException异常;
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,
并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且
不是按优先级;
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一
个对象的锁,而是让它们竞争。
④ 如何在 Java 中正确使用 wait,notify 和 notifyAll
在
Java
中可以用
wait、notify
和
notifyAll
来实现线程间的通信。
1)利用wait()来让一个线程在某些条件下暂停运行。
例如,在生产者消费者模型中,生产者线程在缓冲区为满的时候,消费者在缓冲区为空的时
候,都应该暂停运行。
2)notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程。
3)
notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程。
举个简单的例子:假如有三个线程Thread1、Thread2和Thread3都在等待对象objectA的monitor,此时Thread4拥有对象objectA的monitor,当在Thread4中调用objectA.notify()方法之后,Thread1、Thread2和Thread3只有一个能被唤醒。
注意,被唤醒不等于立刻就获取了objectA的monitor。假若在Thread4中调用objectA.notifyAll()方法,则Thread1、Thread2和Thread3三个线程都会被唤醒,至于哪个线程接下来能够获取到objectA的monitor就具体依赖于操作系统的调度。
⑤ java线程中notify什么意思
每个对象都有一个监视器,wait和notify都必须针对同一个监视器,
Student中notify是通知在this上等待的线程,wait是让出this的监视器,等待其它线程在this上的通知
Teacher中wait是等待其它线程在this上的通知,而且也没有通知其它线程,与Student不对应
大致代码如下:
Student:
synchronized(Test.class) {
while(true) {
//do....
Test.class.notify();
Test.class.wait();
}
}
Teacher:
synchronized(Test.class) {
Test.class.wiat();
//do....
Test.class.nofity();
}
⑥ 关于JAVA中线程notify()方法的一些问题
在多线路程中经常用到。
当在一个线程A中执行
wait()后,这个线程就会处于等待状态。
如果想重新激活线程A,继续向下执行代码,就必须在另一个线程中来激活线程A
class
A
extends
Thread
{
public
void
run()
{
wait();
System.out.println("end");
}
public
synrhonized
void
abc()
{
notify();
}
}
class
B
extends
Therad
{
public
void
run()
{
synchronized(A){A.notify()};
//激活
或
A.abc();
//激活
}
}
上面的代码只是一个形式。
⑦ java中notify怎么使用
notify(),notifyAll()都是要唤醒正在等待的线程,前者明确唤醒一个,后者唤醒全部。
当程序不明确知道下一个要唤醒的线程时,需要采用notifyAll()唤醒所有在wait池中的线程,让它们竞争而获取资源的执行权,但使用notifyAll()时,会出现死锁的风险,因此,如果程序中明确知道下一个要唤醒的线程时,尽可能使用notify()而非notifyAll()。
⑧ java 线程 notify wait怎么用
1、如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后
2.如果没有直接性的调用同类里的其他接口,或者返回,结束等java关键字,代码还是得往下执行的。