Java多线程中对CountDownLatch的使用

CountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行。用给定的计数初始化CountDownLatch,其含义是要被等待执行完的线程个数。每次调用countDown(),计数减1。主程序执行到await()函数会阻塞等待线程的执行,直到计数为0。

package com.zhi.test;

import java.util.Random;
import java.util.concurrent.CountDownLatch;

import org.junit.Test;

/**
 * CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行
 * 
 * @author zhi
 * @since 2019年1月16日09:22:34
 *
 */
public class CountDownLatchTest {

    @Test
    public void test() {
        final int jobCount = 5;
        CountDownLatch latch = new CountDownLatch(jobCount);
        for (int i = 1; i <= jobCount; i++) {
            new Thread(new Job(latch, i)).start();
        }
        try {
            latch.await();
            System.out.println("所有线程已执行完成!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Job implements Runnable {
    private CountDownLatch latch;
    private final int id;

    public Job(CountDownLatch latch, int id) {
        this.latch = latch;
        this.id = id;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(new Random().nextInt(10) * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("任务" + id + "执行完成");
        latch.countDown();
    }
}

执行结果:

任务3执行完成
任务4执行完成
任务2执行完成
任务1执行完成
任务5执行完成
所有线程已执行完成!

猜你喜欢

转载自www.cnblogs.com/zhi-leaf/p/10275334.html