我们常说线程间的通信、线程间的合作,根据他的应用场景其实很容易理解;
例如,生产者Demo (消费者),例如队列,根据生活场景为3360
去菜市场买水果。 你是消费者,蔬菜市场是生产者,没有钱。 等我有钱再买。 菜市场里没有水果。 等着水果卖。 这个相互等待的进程是线程之间的通信进程,也就是合作进程。 那么,从以下两个角度或以上的角度解决这个问题,并介绍关键词
1 .从传统的Object类描述:
1 .等待()方法:
2.notify ()方法:
3 .通告全部(方法:
了解当前线程和其他线程,不要混淆这一点。 因为拥有锁定对象的时机不同
一.等待()、通知()、通知全部) )。
协调
三.生产者-消费者模式的实现
如有不正当之处,敬请谅解,并欢迎您的批评指正。
一.wait()、notify()和notifyAll()
wit ()、notify、notifyAll ) )是Object类的方法。
从这三种方法的说明中可以看出。
1 ) wait ()、notify )和notifyAll ) )方法是本地方法,是final方法,因此不能重写。
2 )调用对象的wait ) )方法时,必须阻止当前线程,并且当前线程必须具有对象的monitor (监视器)或锁
3 )调用一个对象的notify ) )方法可以唤醒正在等待该对象的monitor的线程。 如果多个线程正在等待该对象的监视器,则只能唤醒其中一个线程。
4 ) notifyAll ) )调用方法时,将调用等待此对象的所有monitor线程。
朋友可能会怀疑。 为什么这三个不是Thread类声明中的方法,而是在Object类中声明的方法呢? (当然,Thread类继承了Object类,因此Thread也可以调用三个方法。 其实这个问题很简单,因为每个对象都有一个monitor锁,所以应该等待当前线程中对象的锁定,当然应该在这个对象上操作。 与线程交互会非常复杂,因为当前线程可能会等待锁定多个线程,而不是与当前线程交互。
如上所述,对一个对象的wait (wait )方法的调用是同步块或同步方法(synning method ),因为当前线程必须具有该对象的monitor (监视器)或锁
对象的wait ) )方法,表示当前线程传递对象的monitor,进入等待状态,等待再次获得后续对象的锁(Thread类的sleep方法是当前源
notify ) )方法可以唤醒正在等待对象监视器的线程。 如果多个线程正在等待对象的监视器,则只能唤醒其中一个线程。 我不知道具体会唤醒哪个线程。
同样,对notify ) )方法的调用是同步块或同步方法(synchroning method ),因为当前线程也必须具有该对象的monitor
nofityAll ) )方法与notify ) )方法不同,它可以唤醒等待对象的所有monitor线程。
请在这里注意。 notify (和notifyAll ) )方法只是启动正在等待该对象的monitor线程,而不确定哪个线程可以检索monitor。
举个简单的例子,如果三个线程Thread1、Thread2和Thread3正在等待对象objectA的监视器,则Thread4具有对象objectA的监视器,而Thread4中的对象在Thread4中调用objectA.notifyAll ()方法时,将调用三个线程: Thread1、Thread2和Thread3。 哪个线程下一次可以获取objectA监视器取决于操作系统的时间表。
请特别注意。 线程已启动并不意味着它立即获取了对象的监视器。 在调用notify (或notifyAll )退出同步块并释放对象锁之后,剩下的线程可以执行锁定。
请看一个例子。
无论执行多少次,执行结果都如下。
二.Condition
Condition首次出现在java 1.5中,用于实现线程间的协作,而不是传统的Object的wait ()、notify () ),从而实现Object的wait ()、notify ()和Condition1的await 博客中说,阻止队列实际上是使用Condition模拟线程之间的协作。
Condition是接口,基本方法是await ()和signal () )。 Condition依赖于Lock接口,生成Condition的基本代码是Lock.newCondition ()调用Condition的await () )和signal ()方法
Condition的signal ()是对象的通知);
Condition的signalAll ()与Object的notifyAll () )相对应。
三.生产者-消费者模型的实现
使用Object的wait ()和notify ) )实现:
通过Condition实现