黑马程序员技术交流社区

标题: 关于notify唤醒线程作用范围的问题 [打印本页]

作者: 王乐    时间: 2012-10-9 16:28
标题: 关于notify唤醒线程作用范围的问题
我想请问notify唤醒线程的作用域到底是怎么确定的?
比如下面的代码,视频说notify唤醒的是同一个锁上的等待线程。
那在运行input中的run方法时,执行P.notify是不是唤醒了所有持有P这个锁的等待线程?也就是说是不是把Output中的持有p锁的等待线程和input中等待的线程1起都唤醒了?

下面附上代码

class People
{
        String name="xib";
        String sex;
        boolean flag=false;
}


class Input  implements Runnable
{
private People p;
        Input(People p)
        {
                this.p=p;
        }

public void run()
        {
synchronized(p)
                {
               
       
                if(p.flag)
                try{p.wait();}catch(Exception e){}
                {}
                       p.notify();
                                       }
      

class Output  implements Runnable
{
private People p;
        Output(People p)
        {
                this.p=p;
        }
public void run()
        {
synchronized(p)
                {
               
       
                if(p.flag)
                try{p.wait();}catch(Exception e){}
                {}
                       p.notify();
                                       }

class YouCanFin{
        public static void main(String[] args)
        {
                       
       
       
               
               
                People p1=new People();
               
                Input in=new Input(p1);
                Output out=new Output(p1);
                Thread t1=new Thread(in);
                Thread t2=new Thread(out);
                t1.start();
                t2.start();
               
        }


作者: 给生活加点料    时间: 2012-10-9 18:01
唤醒的不是所有的等待。   nanify唤醒的是随机的。  在这段代码里就一个等待的。  还有就是你这段代码里,没有对falg变量更改值啊。
作者: 曾浩    时间: 2012-10-10 22:08
notify 每次只能唤醒一个线程 但是如果有多个线程wait了 那这些wait的线程就形成了一个等待队列 而notify每次唤醒的只是 队列最前面的那个线程
作者: 王乐    时间: 2012-10-12 20:54
曾浩 发表于 2012-10-10 22:08
notify 每次只能唤醒一个线程 但是如果有多个线程wait了 那这些wait的线程就形成了一个等待队列 而notify每 ...

嗯,谢谢
我明白了
作者: 王乐    时间: 2012-10-12 20:55
给生活加点料 发表于 2012-10-9 18:01
唤醒的不是所有的等待。   nanify唤醒的是随机的。  在这段代码里就一个等待的。  还有就是你这段代码里, ...

是随机唤醒的吗?应该是唤醒线程池中第一个等待的线程吧

嗯这个代码我只截取了能说明问题的1部分,怕太多了大家看着烦
作者: 给生活加点料    时间: 2012-10-12 22:05
王乐 发表于 2012-10-12 20:55
是随机唤醒的吗?应该是唤醒线程池中第一个等待的线程吧

嗯这个代码我只截取了能说明问题的1部分,怕太 ...

大多数情况是唤醒第一个等待的线程。但确实是有随机性。
作者: xuewuzhijing    时间: 2012-10-12 22:35
notify唤醒的是一个线程的排在前面的,notifyall唤醒的是很多个线程的
作者: xuewuzhijing    时间: 2012-10-12 22:35
notify唤醒的是一个线程的排在前面的,notifyall唤醒的是很多个线程的
作者: 王乐    时间: 2012-10-13 12:54
给生活加点料 发表于 2012-10-12 22:05
大多数情况是唤醒第一个等待的线程。但确实是有随机性。

嗯,是这样啊
谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2