13-在指定状态点同步任务
3.4 在指定状态点同步任务
Java并发API提供了可以使多个线程在一个指定点同步的工具类 CyclicBarrier
,该类与3.3节中介绍的 CountDownLatch
有些类似,但是它的一些特殊性使得其更为强大。
CyclicBarrier
类的构造器需要有一个整型参数,这个参数表示在指定点进行同步的线程个数。当需要同步的线程运行到指定点时,可以调用 CyclicBarrier
对象的 await()
方法,然后等待其他线程达到指定点。这个方法使调用线程休眠,等待其他线程的到达。当最后一个需要同步的线程到达并调用 CyclicBarrier
对象的 await()
方法时[2],所有在此等待的线程都会被唤醒并继续执行。
CyclicBarrier
类有一个有趣的优点,它提供的一个重载的构造方法可以额外接收一个 Runnable类
型的初始化参数。这样的话, CyclicBarrier
对象会在所有同步线程到达指定点后,将 Runnable
对象当作一个线程对象来执行。这个特点使得该类适合采用分而治之的编程技术来处理并发任务。
本节将介绍如何使用 CyclicBarrier
类使得一组线程在某个指定点实现同步。并且使用 Runnable
对象使其在所有线程达到指定点后才执行。在这个案例中,将实现在矩阵中查找一个指定数字的功能。案例的实现思路为:将矩阵划分为多个子集,在每个不同的子集中,均有一个线程执行查找功能,一旦所有查找结束后,启动最终任务对所有线程的查找结果进行总结。