Java并发编程之基础篇(四) – 线程间的协作
这篇介绍一下线程之间如何进行通信
之前介绍的内容都是如何保证线程之间的运行互不干扰,但是有的时候,线程之间必须互相合作。比如清洗盘子完成之后,才能对盘子进行烘干操作,烘干必须在清洗之后,那么清洗线程和烘干线程如何进行沟通呢?
Java进程间的通信与访问共享变量一样,都需要借助互斥的特性来实现,在互斥的基础上,JDK
为线程提供了一种自我挂起的能力。也就是说想实现进程间的通信,前提必须是在synchronized
同步块或者方法中实现。
实现互斥同步机制,Java提供了两种方法。内置锁synchronized
和显示锁Lock
,所以线程间通信也有两种方式。
第一种方式是基于内置锁,通过Object
对象提供的wait()
方法以及notify()/notifyAll()
方法实现。
第二种方式是基于显示锁,通过Condition
对象的await()
方法和signal()/signaAll()
方法。
内置锁——线程间通信
wait()
:如果当前线程在等待某个条件发生变化之后,才能继续执行,但是触发条件发生变化,超出了当前线程的能力。通常需要另外一个线程来改变这种条件的时候,就需要考虑使用wait()
方法,将当前线程挂起,等待条件的改变。
比如想把盘子由清洗状态改为烘干状态,必须由烘干线程完成。只有烘干线程才知道烘干操作什么时候完成。
当调用wait()
方法将当前挂起之后,只有在notify()
或者notifyAll()
方法发生时,这个任务才会被唤醒,继续执行。
wait()
方法提供了两种使用形式,第