闭锁

一种同步工具类,可以延迟线程的进度直到闭锁的值等于0(终止状态)
可用于在执行一个任务前,必须把这个任务前的全部完成,才能执行这个任务。
比如,游戏要等所有玩家都准备好之后才开始 所有资源都初始化之后才开始加载类。

t.start();启动线程后继续向下执行,不过线程会在startGate.await();的地方等待

    public long timeTasks(int nThreads, final Runnable task)
            throws InterruptedException {
        final CountDownLatch startGate = new CountDownLatch(1);
        final CountDownLatch endGate = new CountDownLatch(nThreads);

        for (int i = 0; i < nThreads; i++) {
            Thread t = new Thread() {
                public void run() {
                    try {
                        //所有线程启动后,都会在这个地方等待startGate闭锁等于0  
                        startGate.await();
                        try {
                            //虽然是实现了runnable 不过task.run()不会启动线程 和执行普通方法一样
                            task.run();
                        } finally {
                            //每一个线程执行任务之后,countdown
                            endGate.countDown();
                        }
                    } catch (InterruptedException ignored) {
                    }
                }
            };
            t.start();
        }

        long start = System.nanoTime();
        //打开闭锁  startGate
        startGate.countDown();
        //等待endGate闭锁等0之后,继续向下执行
        endGate.await();
        long end = System.nanoTime();
        return end - start;
    }

你可能感兴趣的:(闭锁)