Multithreading (eight synchronous counter -CyclicBarrier)

CyclicBarrier- cycle fence

When invoked await thread is blocked when it reaches the fence, only the thread data reaches a threshold set by the fence, the fence release, all threads to continue, the end of the round, fence into the next round.

Case: the fence waiting for the release of three threads

Task

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Task implements Runnable{

    private CyclicBarrier cyclicBarrier;

    public Task(CyclicBarrier cyclicBarrier) {
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + "准备就绪");
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            System.out.println(Thread.currentThread().getName() + "中断了......");
        } catch (BrokenBarrierException e) {
            System.out.println(Thread.currentThread().getName() + "抛出损坏异常....");
        }
    }
}

Startup file

import java.util.concurrent.CyclicBarrier;

public class Main {

    public static void main(String[] args) throws InterruptedException {

        System.out.println("主线程开始......");

        CyclicBarrier cb = new CyclicBarrier(3, new Runnable(){

            @Override
            public void run() {
                System.out.println("子线程全部就位,开始执行制定任务......");
            }
        });

        Thread t1 = new Thread(new Task(cb), "Thread-1");
        Thread t2 = new Thread(new Task(cb), "Thread-2");
        Thread t3 = new Thread(new Task(cb), "Thread-3");

        t1.start();
        t2.start();
        t3.start();

        Thread.sleep(2000);
        System.out.println("主线程执行完毕");
    }
}

result:

Multithreading (eight synchronous counter -CyclicBarrier)

CyclicBarrier exception

CyclicBarrier If you can not meet the threshold, or wait for the timeout thread is interrupted, all waiting threads will throw an exception damage, and then into the next round.

Multithreading (eight synchronous counter -CyclicBarrier)

Case: abnormal damage, assuming a threshold of 4, it has three threads waiting, one of the interruption.

Task code unchanged

Modify the startup file

import java.util.concurrent.CyclicBarrier;

public class Main {

    public static void main(String[] args) throws InterruptedException {

        System.out.println("主线程开始......");

        CyclicBarrier cb = new CyclicBarrier(4, new Runnable(){

            @Override
            public void run() {
                System.out.println("子线程全部就位,开始执行制定任务......");
            }
        });

        Thread t1 = new Thread(new Task(cb), "Thread-1");
        Thread t2 = new Thread(new Task(cb), "Thread-2");
        Thread t3 = new Thread(new Task(cb), "Thread-3");

        t1.start();
        t2.start();
        t3.start();
        Thread.sleep(1000);
        t1.interrupt();

        Thread.sleep(2000);
        System.out.println("主线程执行完毕");
    }
}

result:

Multithreading (eight synchronous counter -CyclicBarrier)

Source analysis:

CyclicBarrier achieve lock mechanism based on ReentrantLock and Condition.

Multithreading (eight synchronous counter -CyclicBarrier)

Member variables

Multithreading (eight synchronous counter -CyclicBarrier)

await method:

Multithreading (eight synchronous counter -CyclicBarrier)
Multithreading (eight synchronous counter -CyclicBarrier)
Multithreading (eight synchronous counter -CyclicBarrier)

breakBarrier damage methods:

Multithreading (eight synchronous counter -CyclicBarrier)

Guess you like

Origin blog.51cto.com/janephp/2404678