qq_38982528 2022-01-05 22:34 采纳率: 100%
浏览 20
已结题

CyclicBarrier 达到要求以后继续执行await还会执行目标runnable吗,为什么我的完成最后任务打印了2次

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {

static class TaskThread extends Thread {

    CyclicBarrier barrier;

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

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println(getName() + " 到达栅栏 A");
            System.out.println("O(∩_∩)O哈哈~" + barrier.getNumberWaiting());
            barrier.await();
            System.out.println(getName() + " 冲破栅栏 A");

            Thread.sleep(2000);
            System.out.println(getName() + " 到达栅栏 B");
            System.out.println("哈哈" + barrier.getNumberWaiting());
            barrier.await();

            System.out.println(getName() + " 冲破栅栏 B");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    int threadNum = 5;
    CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " 完成最后任务");
        }
    });

    for(int i = 0; i < threadNum; i++) {
        new TaskThread(barrier).start();
    }
}

}

  • 写回答

2条回答 默认 最新

  • zcl_1991 2022-01-06 14:58
    关注

    每一个 await() 都是一轮;
    所有线程在到达第一个await()时,最后一个到达的线程会执行一次Runnable 里面的任务;
    然后重置;
    然后所有线程都继续执行,直到遇到第二个await(),等所有线程都到达第二个await()时,最后一个到达第二个await()的线程又会去执行一次Runnable 里面的任务;
    然后再重置;
    ...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 修改了问题 1月5日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程