- 线程通讯
1.1. 为什么要线程通信
多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信。
1.2. 线程通讯方式
线程间通信常用方式如下:
休眠唤醒方式:
Object的wait、notify、notifyAll
Condition的await、signal、signalAll
CountDownLatch:用于某个线程A等待若干个其他线程执行完之后,它才执行
CyclicBarrier:一组线程等待至某个状态之后再全部同时执行
Semaphore:用于控制对某组资源的访问权限
1.2.1. 休眠唤醒方式
Object的wait、notify、notifyAll
Condition的await、signal、signalAll
Object和Condition休眠唤醒区别
object wait()必须在synchronized(同步锁)下使用,
object wait()必须要通过Nodify()方法进行唤醒
condition await() 必须和Lock(互斥锁/共享锁)配合使用
condition await() 必须通过 signal() 方法进行唤醒
1.2.2. CountDownLatch方式
CountDownLatch是在java1.5被引入的,存在于java.util.concurrent包下。
CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。
每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
示例代码:
1.2.3. CyclicBarrier方式
CyclicBarrier是在java1.5被引入的,存在于java.util.concurrent包下。
CyclicBarrier实现让一组线程等待至某个状态之后再全部同时执行。
CyclicBarrier底层是三个线程同时启动,示例代码如下:
执行效果如下:三个线程同时启动
1.2.4. Semaphore方式
Semaphore是在java1.5被引入的,存在于java.util.concurrent包下。
Semaphore用于控制对某组资源的访问权限。
工人使用机器工作,示例代码如下:
执行效果如下:
1.3 小结
1.3.1. sleep和wait区别
1.3.2. wait和notify区别
wait和notify都是Object中的方法
wait和notify执行前线程都必须获得对象锁
wait的作用是使当前线程进行等待
notify的作用是通知其他等待当前线程的对象锁的线程
--------------人生充满着期待,梦想连接着未来--------------
订阅【Java直通车】获取免费Java书籍。