-
一句话总结wait和notify: wait使线程停止运行, 而notify使停止的线程继续运行。
-
wait()执行后,线程进入等待线程队列,释放锁。notify()执行后,并不立即释放锁,后面语句要执行完才释放。
关键字synchronized可以将任何一个Object作为同步对象看待,JAVA为每一个Object都实现了wait()和notify()
方法。 wait()和notify() 必须用在synchronized的同步区类。
notify() 方法可以随机唤醒等待队列中等待同一共享资源的“一个”线程,使该线程退出等待队列,进入可运行状态。
notifyAll()方法可以使所有正在等待同一共享资源的“全部”线程从等待状态退出,进入可运行状态。 -
每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列。
-
sleep()和wait() 的区别
a, sleep() 方法是Thread类中的方法, wait()是Object类中的方法
b, sleep() 不释放锁。 -
wait()和notify() 最常用于 生产者和消费者模式实现。
在一个生产者和一个消费者时,是没有问题的。
但是在多个生产者和 多个消费者时就很可能出现 “假死” 的现象。 即所有的线程都处于WAITING状态。
因为all用的都是同一把锁, notify不能保证唤醒是异类,也许是同类。 生产者唤醒生产者…
解决方案超级简单, 把生产者和消费者中所有的notify()都改成notifyAll() -
一个生产者 对 多个消费者 进行栈操作 很可能出现异常。
问题在于if语句作为条件判断,因为条件发生改变时没有得到及时的响应。将if改成while,但是会
出现新的问题—假死—> 改成notifyAll(); -
用管道流进行线程间的通讯:字节流
PipeInputStream 和 PipeOutputStream.最主要是把输入流和输出流联系起来。
outputStream.connect(inputStream) -
join 的作用是等待线程对象销毁。
join(long) 和 sleep(long)的区别:(都是等多久的事儿)
a, join(long)的功能在内部使用wait(long) 方法来实现, 所以具有释放锁的特点。 sleep(long)
是不会释放锁的。 -
join() 后面的代码提前运行:解释意外
这个直接没看懂,先pass掉。 -
所有的线程都使用同一个变量值 public static。 如果要实现每一个线程都有自己的共享变量值:ThreadLocal.
ThreadLocal解决的是变量在不同线程间的隔离性,也就是说不同的线程拥有自己的值。
第三章:线程间通信
最新推荐文章于 2024-06-17 22:13:03 发布