CountDownLatch 多线程记数

package ice.snow.count;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 使用CuntDownLatch类进行线程技术,保证所有的线程执行完之后,在执行下一步操作
 * @author Binbin.Yang1
 *
 */
public class Main {

    public static void main(String[] args) {
        // 定义线程数量
        int size = 5;
        // 定义countDownLatch
        CountDownLatch latch = new CountDownLatch(size);
        // 使用线程池进行线程处理
        ExecutorService executor = Executors.newCachedThreadPool();
        for (int i = 0 ; i < size ; i ++) {
            final int a = i;
            // 这里采用jdk8的lambda表达式进行线程的实现,也可以使用传统实现Runnable的方式进行操作,将latch作为参数传给Runnable的实现类即可
            executor.execute(() -> {
                System.out.println("线程-" + a + " 在执行");
                try {
                    // 每个线程沉睡两秒
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 线程执行结束后,记数减一
                latch.countDown();
            });
        }
        try {
            // 记数处于阻塞状态,当记数为0时可进行下一步操作,也可以使用await的重载方法,设置阻塞时间
            latch.await();
        }catch (Exception e) {
            e.printStackTrace();
        }
        executor.shutdown();
        System.out.println("线程全部执行结束");
    }
}

 

posted @ 2018-05-16 14:30  冰丶丿小墨  阅读(160)  评论(0编辑  收藏  举报