notifywait源码_notify notifyall wait

hacker|
106

文章目录:

java有关notify和wait的问题:下面代码为什么会出现两个线程都睡着了为什么其中一个唤不醒下一个线程呢?

首先你要明确是线程中的哪个对象阻塞了 ,上面你写的prev.wait(),明明是线程操作prev时候阻塞,你却要用now.notify(),即用了now对象来唤醒prev对象监视器上等待的单个线程,这是不可能的,各自对象对应各自的,改为prev.notify( )便可以了,但是最后一次还是唤不醒 ,当然这只是代码逻辑的问题。

java 多线程 中 wait(), notify() 的疑问。

1. synchronized (b)// 括号里的b是什么意思,起什么作用?

答:这句b作为一个唯一的对象被锁定。b是不能同时被两个或多个线程同时访问。

2.b.wait();// 这一句是什么意思,究竟让谁wait?

让b等待。你可以把这句注释掉,输出的顺序要改变了。

java线程wait(),notify()问题,以下是代码

把生产者的run方法这样写:

public void run() {

int n = 0;

while (n = 10) {

n++;

q.put(n);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

其实没什么特殊的,我只似乎让生产者每次生产出来一个东西之后稍稍睡一会,然后你在run一下看看效果,应该是每隔1s就会输出一次,一共11次。

你的代码本身没有问题,问题在于要知道当put方法里面notify的时候,你不会知道它会唤醒那个线程,这个完全是jvm看自己心情决定的,那么就会出现的情况是生产者跑的飞快,它可能一下子就把11次循环都跑完,然后最后一次notify完了之后以后都不会在notify了,剩下一个消费者可怜巴巴的wait,可是永远不会有人notify他了,然后就over了。

可能你不是很明白我说的意思,你按照我说的把代码改一下,然后自己思考一下,这个东西会有一个顿悟的过程,可能你一时想不明白,但是将来可能一下子就明白我的意思了。

BTW,java多线程其实还是比较复杂的,让各个线程在你的脑子里面跑起来,你如果能在自己脑子里面模拟多个线程一起跑,你就会比较容易想明白。

另外,多线程的代码debug不能给你提供什么帮助,我也有同事喜欢用debug调试多线程的程序,我对此颇为不屑,因为如果你在run里面设置了断点,那么我可以说,你永远都不会知道多线程是怎么回事,一定要在自己脑子里面想才行,实际上我让线程sleep一会实际上相当于是加一个1s的断点,1s后断点取消,程序继续跑,这个可以帮助你理解。

java 多线程 notify与wait

/*你这里的synchronized (this)中  this 对象不一样,第一次的时候是ta,第二次的时候是tb,因此调用notify不会唤醒另一个对象的wait*/

public class ThreadTest extends Thread{

private final int Max = 7;

private String name;

public static void main(String[] args) throws InterruptedException {

ThreadTest ta = new ThreadTest("A");

ThreadTest tb = new ThreadTest("B");

ta.start();

Thread.sleep(1000);

tb.start();

}

public ThreadTest(String name) {

this.name = name;

}

@Override

public void run() {

synchronized (Thread.class) {//这个this换成类对象 就可以了

for(int i=0;ithis.Max;i++){

System.out.println("name:"+this.name);

Thread.class.notify();

System.out.println("nofity after:"+this.name);

try {

System.out.println(this.name+" wait before");

Thread.class.wait();

System.out.println(this.name+" wait after");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

notify wait怎么使用 java

Wait()和notify():如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。

一般用在synchronized机制中

例如:

线程A

synchronized(obj) {

while(!condition) {

obj.wait();

}

obj.doSomething();

}

当线程A获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程A就wait()。

在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A:

线程B

synchronized(obj) {

condition = true;

obj.notify();

}

需要注意的概念是:

◆调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {……} 代码段内。

◆调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {……} 代码段内唤醒A.

◆当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。

◆如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。

◆obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。

◆当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。

4条大神的评论

  • avatar
    访客 2022-07-09 上午 10:21:11

    的疑问。3、java线程wait(),notify()问题,以下是代码4、java 多线程 notify与wait5、notify wait怎么使用 javajava有关notify和w

  • avatar
    访客 2022-07-09 上午 06:56:35

    bj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继

  • avatar
    访客 2022-07-09 上午 06:00:04

    以下是代码4、java 多线程 notify与wait5、notify wait怎么使用 javajava有关notify和wait的问题:下面代码为什么会出现两个线程都睡着了为什么其中一个唤不醒下一个线程呢?首先你要明确是线程中的哪个对象阻塞了

  • avatar
    访客 2022-07-09 上午 04:34:32

    otify的时候,你不会知道它会唤醒那个线程,这个完全是jvm看自己心情决定的,那么就会出现的情况是生产者跑的飞快,它可能一下子就把11次循环都跑完,然后最后一次notify完了之后以后都不会在notify了,剩下一个消费者可

发表评论