A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王乐 中级黑马   /  2012-10-9 16:28  /  2494 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想请问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();
               
        }

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

8 个回复

正序浏览
王乐 中级黑马 2012-10-13 12:54:48
9#
给生活加点料 发表于 2012-10-12 22:05
大多数情况是唤醒第一个等待的线程。但确实是有随机性。

嗯,是这样啊
谢谢
回复 使用道具 举报
notify唤醒的是一个线程的排在前面的,notifyall唤醒的是很多个线程的
回复 使用道具 举报
notify唤醒的是一个线程的排在前面的,notifyall唤醒的是很多个线程的
回复 使用道具 举报
王乐 发表于 2012-10-12 20:55
是随机唤醒的吗?应该是唤醒线程池中第一个等待的线程吧

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

大多数情况是唤醒第一个等待的线程。但确实是有随机性。
回复 使用道具 举报
给生活加点料 发表于 2012-10-9 18:01
唤醒的不是所有的等待。   nanify唤醒的是随机的。  在这段代码里就一个等待的。  还有就是你这段代码里, ...

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

嗯这个代码我只截取了能说明问题的1部分,怕太多了大家看着烦
回复 使用道具 举报
曾浩 发表于 2012-10-10 22:08
notify 每次只能唤醒一个线程 但是如果有多个线程wait了 那这些wait的线程就形成了一个等待队列 而notify每 ...

嗯,谢谢
我明白了
回复 使用道具 举报
notify 每次只能唤醒一个线程 但是如果有多个线程wait了 那这些wait的线程就形成了一个等待队列 而notify每次唤醒的只是 队列最前面的那个线程
回复 使用道具 举报
唤醒的不是所有的等待。   nanify唤醒的是随机的。  在这段代码里就一个等待的。  还有就是你这段代码里,没有对falg变量更改值啊。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马