假设现在有两条正在运行的线程,一条线程专门输入数据,另外一条专卖负责读取数据。并且要实现,输入一个数据过后,另一方取出一个数据。在java多线程的情况下,当输入线程抢到CPU的执行权后,下一次还有可能是输入线程抢到CPU的执行权,就达不到我们想过要的效果。因此,我们需要输入线程执行一次过后,就让它等待,并叫醒输出线程。然后让输出线程执行,执行一次后等待,并且叫醒输入线程。就这样循环往复,从而达到我们需要的线程的运行状态。java多线程等待唤醒机制的诞生为了解决循环等待消耗CPU以及信息及时性问题。通俗来讲就是由主动变为被动,当条件成立时,主动通知对应的线程,而不是让线程本身来询问。
实现步骤
这个类帮助我们模拟实现数据的输入输出
2.创建一个输入线程Input类
这一步是等待唤醒机制的核心部分。输入线程第一次进来时fig为false,继续往下执行。set过后,将fig改为true,并且唤醒下一个线程(输出线程)。就算下一次输入线程又抢到了CPU的执行权,判断fig为true则等待。
3.创建一个输出线程Output类
假如输出线程第一次抢到CPU的执行权,判断fig为false(User对象默认值为false),等待。当输入线程执行一遍后,就会将fig改为true并且唤醒输出线程,此时输出线程才具备执行资格。输出线程执行一遍后,将fig置为false,并唤醒输入线程,以此往复。
4.创建一个测试类
让我们来看下最后的运行结果:
从输出结果上不难看出输入输出线程是来回切换的。通过整个程序的代码以及结果我们可以看出:
(1)等待唤醒机制使用了wait()和notify()方法(也可以使用notifyAll()方法)。
(2)构造方法方法是Object类中的,因为这几个方法是通过同步锁对象来调用的,而同步锁对象可以为任意对象,所以这几个方法定义在Object中很合理。
(3)使用wait()方法后会释放同步锁对象,这样其他的线程就可以获取该锁对象进入业务处理;并且在重新获取锁对象的时候,会再次进入同样的代码位置。
(4)两个线程必然有逻辑上的业务关系,不然这种用法毫无意义。
(5)等待唤醒机制本质上是线程间通讯的一种体现或者实现方式。
实际上等待、唤醒是线程间通信的手段之一,用来协调多个线程操作同一个数据源。java多线程等待唤醒机制能够有效地帮助我们解决优化循环等待的问题,能够让线程有序的进行。在今后的编程中我们不可避免的要用到java多线程等待唤醒机制,让它成为我们手中的利刃,帮助我们破开编程开发中遇到的迷障。
HelloWorld10-31 08:24
军哥08-12 23:29
江湖人称小李白12-10 10:41
IT逐梦者08-17 21:43
HelloWorld11-06 11:19