黑马程序员技术交流社区

标题: 关于多线程的问题 [打印本页]

作者: 明月刀割芳草    时间: 2015-8-12 16:31
标题: 关于多线程的问题
this.wait()执行之后线程进入等待 那this.notify()是哪个线程执行的呢?

作者: kingxiao    时间: 2015-8-12 17:09
唤醒的是等待最近的那个线程
作者: yuZhe_toString    时间: 2015-8-12 19:48
随机的,不可控
作者: ℃葫芦    时间: 2015-8-12 20:01
notify唤醒的是和自己使用用一锁的其他冻结的线程,随机一条。
因为是随机的不确定,所以有可能唤醒了另一条本方线程,导致死锁。
所以就需要用notifyAll  
作者: boboyuwu    时间: 2015-8-12 20:23
℃葫芦 发表于 2015-8-12 20:01
notify唤醒的是和自己使用用一锁的其他冻结的线程,随机一条。
因为是随机的不确定,所以有可能唤醒了另一 ...

不是随机的吧  唤醒的是等待最久的那个吧
作者: ℃葫芦    时间: 2015-8-12 20:29
boboyuwu 发表于 2015-8-12 20:23
不是随机的吧  唤醒的是等待最久的那个吧

我学的是毕向东的视频 里面说的就是随机,
而且又逻辑问题,假如3条线程,第一条等待了第二条是不是要唤醒第一条呢?
因为第三条还没开始呢不存在等待时间 也就是等待时间是0,

作者: zby_allan    时间: 2015-8-12 20:34
等待最久的吧
作者: 明月刀割芳草    时间: 2015-8-12 22:02
℃葫芦 发表于 2015-8-12 20:01
notify唤醒的是和自己使用用一锁的其他冻结的线程,随机一条。
因为是随机的不确定,所以有可能唤醒了另一 ...

我的意思是这条线程都已经wait 了,那么this.notify()的this是什么?
作者: boboyuwu    时间: 2015-8-12 22:14
℃葫芦 发表于 2015-8-12 20:29
我学的是毕向东的视频 里面说的就是随机,
而且又逻辑问题,假如3条线程,第一条等待了第二条是不是要唤 ...

遇到问题你要测试不要听老师的
作者: boboyuwu    时间: 2015-8-12 22:15
℃葫芦 发表于 2015-8-12 20:29
我学的是毕向东的视频 里面说的就是随机,
而且又逻辑问题,假如3条线程,第一条等待了第二条是不是要唤 ...

第二条肯定唤醒第一条啊因为只有一个等待   但是多条线程同时等待不是随机唤醒
作者: ℃葫芦    时间: 2015-8-12 22:18
明月刀割芳草 发表于 2015-8-12 22:02
我的意思是这条线程都已经wait 了,那么this.notify()的this是什么?

必然是先notify 再wait的假设两条线程,一条输入一条输出,
那么设定一个共有的flog   
循环结构里,输入线程如果为true,就等待,如果false就输入,然后设置flog为真,再唤醒,
这时循环上来,再判断 为ture,等待。
而另一边输出线程部分,判定flog如果false,就等待,如果为ture 就输出,然后设置flog为false,再唤醒
然后循环上来 判断为false ,等待。
因为是共有的flog  所以就可以控制输入一次输出一次了。

作者: ℃葫芦    时间: 2015-8-12 22:23
boboyuwu 发表于 2015-8-12 22:15
第二条肯定唤醒第一条啊因为只有一个等待   但是多条线程同时等待不是随机唤醒 ...

我已经实践测试过了,还请移步http://bbs.itheima.com/thread-224492-1-1.html
作者: 孟茹    时间: 2015-8-13 19:40
这要看你的是几个线程。如果是多线程对多线程(即多个生产者和多个消费者),最好用notifyAll(),不然容易导致线程都等待的状况;;如果要是一个线程对一个线程(即一个生产者和一个消费着)那唤醒自然就是相同锁的那个线程,,多线程一定要注意wait和notify是锁调用的,对同一个共享数据,一定要保证同一把锁




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