线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体。使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会对各线程任务在处理的过程中进行有效的把控与监督。
1.等待/通知机制
(1) wait()
wait() 作用是使当前执行代码的线程进行等待
线程在 wait() 方法处停止执行,直到接到通知或被中断为止。只能在同步方法或同步块中调用 wait() 方法,在执行wait() 方法后释放当前线程锁,在从wait() 返回前,线程与其他线程竞争重新获得锁。
(2) notify()
notify() 方法用来随机通知相同对象锁的处于等待状态的其他线程
notify() 方法只能在同步方法或同步块中调用(线程必须获得该对象的对象级别锁)。如果有多个线程等待,则由线程规划器随机挑选出其中一个呈wait状态的线程,对其发出通知 notify并使它等待获取该对象的对象锁。
在执行 notify方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行 notify方法的线程将程序执行完(退出 synchronized代码块),当前线程才会释放锁,而呈wat状态所在的线程才可以获取该对象锁。当第一个获得了该对象锁的wait线程运行完毕以后,它会释放掉该对象锁,其他wait状态等待的线程如果没有得到该对象的通知,还会继续阻塞在wait状态,直到这个对象发出一个 notify或 notifyAll
wait 使线程停止运行;而notify使停止的线程继续运行。
(3) notifyAll()
notifyAll() 方法用来通知相同对象锁的所有等待状态的其他线程
(4) wait(long)
wait(long) 功能是设置等待时间内是否有线程对其进行唤醒,如果超过这个时间则自动唤醒。
(5) 线程间实现原理
管道流( pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信。
2.join方法使用
(1) join()
join()方法作用是等待线程对象销毁(具有使线程排队运行作用)。
作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z后面的代码(如主线程想等待子线程执行完成再结束,比如子线程处理一个数据,主线程要取得这个数据中的值)。
(2) join(long)
join(long) 功能是设定等待时间内等待线程对象销毁,如果超过这个时间则自动执行当前线程。