首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于同步的CyclicBarrier与CountDownLatch

用于同步的CyclicBarrier与CountDownLatch
EN

Stack Overflow用户
提问于 2012-09-13 14:51:50
回答 1查看 551关注 0票数 2

我已经阅读了Bloch的第69条(有效的Java),有一个简单的定时执行框架的例子,它使用3个CountDownLatch来同步线程。另外,Bloch说这个例子可以用1个CyclicBarrier重写。我已经尝试过这样做,并获得了下一个代码:

代码语言:javascript
复制
     public static long time(ExecutorService exec, int count) throws InterruptedException, BrokenBarrierException {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(count+1);
            for (int i = 0; i < count; i++) {
                exec.submit(new Worker(cyclicBarrier, i));
            }
            System.out.println("Start processing");
            cyclicBarrier.await();
            long time = System.nanoTime();
            cyclicBarrier.await();
            long elapsedTime = (System.nanoTime() - time)/1000;
            System.out.println("FIN. ");
            return elapsedTime;

        }
private static class Worker implements Runnable {

        final CyclicBarrier cyclicBarrier;
        int workerNumber;

        Worker(CyclicBarrier cyclicBarrier, int workerCount) {
            this.cyclicBarrier = cyclicBarrier;
            this.workerNumber = workerCount;
        }

        public void run() {
            try {
                cyclicBarrier.await();
                work();
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
        private void work() {
            System.out.println("Worker " + workerNumber + " starts his job");
            System.out.println("Worker " + workerNumber + " finishes his job");
        }

    }

但我认为这里(在time方法中)有一个问题:在第一个await之后,我尝试测量线程开始执行的时间,所以我想在所有其他线程开始之前测量这个时间。不能保证此(long time = System.nanoTime();)指令将在另一个线程启动之前执行。

如何使用CyclicBarrier实现这样的功能?有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-13 16:28:51

CyclicBarrier允许您定义要在所有线程达到屏障之后、恢复执行之前执行的屏障操作。使用CyclicBarrier(int, Runnable)来定义它。

显然,在您的情况下,需要区分执行屏障操作之前和完成它之后,就像这样:

代码语言:javascript
复制
class TimingAction implements Runnable {
    private boolean running;
    private long start;
    private long elapsed;

    public void run() {
        if (running) {
            elapsed = System.nanoTime() - start;
            running = false;
        } else {
            start = System.nanoTime();
            running = true;
        }
    }
    ...
}

TimingAction timer = new TimingAction();
CyclicBarrier cyclicBarrier = new CyclicBarrier(count + 1, timer);
...
long elapsed = timer.getElapsed();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12400922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档