欢迎访问宙启技术站
智能推送

多线程(八、同步计数器-CyclicBarrier)

发布时间:2023-05-16 17:31:52

在多线程编程中,有时候需要在多个线程之间进行同步操作,以保证线程之间的数据一致性和正确性,这就需要使用同步计数器。同步计数器是一种用来控制多个线程同步操作的机制,它可以让每个线程等待其他线程完成任务后再继续执行,从而保证线程之间的同步。

CyclicBarrier是Java中的一个同步计数器,它可以让所有的线程在相同的时间点上进行同步操作。在CyclicBarrier中,每个线程都会调用await()方法来等待其他线程的到达,当所有线程都到达后,CyclicBarrier会执行一个任务。

使用CyclicBarrier可以很方便的实现一个多个线程同时处理一个问题的场景,例如,多个线程同时下载同一个文件,每个线程下载文件的某一部分,并在完成后合并所有的部分,以得到完整的文件。在这个场景中,每个线程都会等待其他线程下载完成后再进行文件合并操作。

下面是一个使用CyclicBarrier的例子:

import java.util.concurrent.*;

class Worker implements Runnable {

    private CyclicBarrier barrier;

    public Worker(CyclicBarrier barrier) {
        this.barrier = barrier;
    }

    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + " is waiting");
            barrier.await(); //等待所有线程都到达
            System.out.println(Thread.currentThread().getName() + " is working");
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

public class TestCyclicBarrier {

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

        int numThreads = 5;
        CyclicBarrier barrier = new CyclicBarrier(numThreads);
        ExecutorService threadPool = Executors.newFixedThreadPool(numThreads);

        for (int i = 0; i < numThreads; i++) {
            threadPool.execute(new Worker(barrier));
        }

        threadPool.shutdown();

        while (!threadPool.awaitTermination(1, TimeUnit.SECONDS)) {
            System.out.println("Waiting for the threads to finish");
        }

        System.out.println("All threads finished");
    }
}

上面的代码中,创建了5个线程,并且使用CyclicBarrier进行同步操作。每个线程都会等待所有的线程都到达后再执行任务。在主线程中,等待所有线程完成后输出“All threads finished”。

总结:

CyclicBarrier是一种同步计数器,它可以让多个线程在相同的时间点上进行同步操作。使用CyclicBarrier可以很方便地实现多个线程同时处理一个问题的场景,例如,多个线程同时下载同一个文件,并在完成后将所有的部分合并成一个完整的文件。在实现过程中,每个线程都会等待其他线程完成后再进行操作,从而保证线程之间的同步。