CyclicBarrier类是Java中的一个同步工具类,用于实现多个线程之间的同步点。
一、基本概念
CyclicBarrier意思是循环屏障,是java.util.concurrent
包下的重要类。它允许一组线程相互等待,直到所有线程都到达某个共同点(屏障点),然后继续执行后续任务。由于它可以被循环使用,因此得名CyclicBarrier(循环屏障)。
二、主要特点
- 同步点:CyclicBarrier提供了一个同步点,多个线程可以在这个点等待,直到所有线程都到达了这个点,然后它们才能继续执行。
- 循环使用:一旦所有等待线程都到达同步点(屏障),屏障就会被重置,可以被再次使用。
- 可选屏障操作:在创建CyclicBarrier对象时,可以指定一个屏障操作(Runnable),当所有线程都到达屏障时,该操作会被执行。这个操作由最后一个到达屏障的线程来执行。
三、构造方法
CyclicBarrier类有两个构造方法:
public CyclicBarrier(int parties)
:创建一个指定线程数量(parties)的CyclicBarrier对象。任一线程到达屏障都会阻塞,直到指定数量的线程都到达屏障才会继续执行任务。public CyclicBarrier(int parties, Runnable barrierAction)
:创建一个指定线程数量(parties)的CyclicBarrier对象,并指定一个屏障操作(barrierAction)。任一线程到达屏障都会阻塞,直到指定数量的线程都到达屏障时,先执行屏障操作,然后所有的等待线程再继续执行任务。
四、主要方法
CyclicBarrier类的主要方法包括:
public int await()
:线程执行CyclicBarrier对象的await()方法,表示当前线程已经到达屏障,线程处于阻塞状态,直到所有线程都到达屏障。public int await(long timeout, TimeUnit unit)
:线程执行CyclicBarrier对象的await(timeout)方法,表示当前线程已经到达屏障,并设置一个超时时间。如果在超时时间范围内,所有线程都到达屏障,那么线程正常执行。如果超时时间到了,仍然还有线程没有到达屏障,那么线程会抛出TimeoutException
超时异常,然后线程任务继续执行(尽管此时可能不是所有线程都已经到达屏障)。public void rese