マルチスレッドタスク - ループバックフェンス - スレッドカウンター - セマフォ

まず、ループフェンス-CyclicBarrier

1.定義
  • 数がスレッド数に達すると、初期化スレッドマークの数は、並行して、スレッドをマーキング開始しました。すべての同時実行スレッドが同じ状態のまま。
2、シーン
  • 他のスレッドを待機が完了するときに、このようなマルチスレッド計算として、互いのニーズに合わせ、および結果を要約。
3、コード

実行シーケンス:スレッドを作成して開始し、主な機能がブロックされていない、cb.await();ブロックが継続するスレッドの後、成立を加えた後の方法の完全な実装の数にスレッドを待った後。

CyclicBarrier cb=new CyclicBarrier(5,()->{
    System.out.println(Thread.currentThread()+"所有线程准备完毕,由最后一个线程执行此方法");
    System.out.println(Thread.currentThread()+"执行聚合操作");
});
IntStream.range(0,5).forEach(i->{
    new Thread(()->{
        System.out.println(Thread.currentThread()+"启动");
        try {
            System.out.println(Thread.currentThread()+"执行业务逻辑");
            cb.await();//一般之后没有代码
            System.out.println(Thread.currentThread()+"聚合后同步执行");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }).start();
});
System.out.println("mainx执行 ");

==== 结果:
mainx执行 
Thread[Thread-3,5,main]启动
Thread[Thread-4,5,main]启动
Thread[Thread-2,5,main]启动
Thread[Thread-1,5,main]启动
Thread[Thread-1,5,main]执行业务逻辑
Thread[Thread-0,5,main]启动
Thread[Thread-2,5,main]执行业务逻辑
Thread[Thread-4,5,main]执行业务逻辑
Thread[Thread-3,5,main]执行业务逻辑
Thread[Thread-0,5,main]执行业务逻辑
Thread[Thread-0,5,main]所有线程准备完毕,由最后一个线程执行此方法
Thread[Thread-0,5,main]执行聚合操作
Thread[Thread-0,5,main]聚合后同步执行
Thread[Thread-4,5,main]聚合后同步执行
Thread[Thread-2,5,main]聚合后同步执行
Thread[Thread-1,5,main]聚合后同步执行
Thread[Thread-3,5,main]聚合后同步执行
复制代码

第二に、スレッドカウンター-CountDownLatch

1.定義
  • フラグが0である場合、初期化マークの数は、通話をブロックする現在のスレッドは、タグ数をカウントダウン-1可能待ち、次にブロックされたスレッドを覚まします。他のスレッドが実行を終了するためにあなたは待つことができます。
2、シーン
  • メインスレッドで実行した後、子スレッドが終了するのを待つか、いくつかの時間リソースを待つ必要がする必要があります。
3、コード
CountDownLatch countThread=new CountDownLatch(5);

IntStream.range(0,5).forEach(i->{
    new Thread(()->{
        Thread.sleep(1000L);
        
        System.out.println(Thread.currentThread()+"执行逻辑");
        countThread.countDown();
    }).start();
});

System.out.println(Thread.currentThread()+"等待所有线程完毕");
countThread.await();
System.out.println(Thread.currentThread()+"继续");

==== 结果:
Thread[main,5,main]等待所有线程完毕
Thread[Thread-3,5,main]执行逻辑
Thread[Thread-0,5,main]执行逻辑
Thread[Thread-4,5,main]执行逻辑
Thread[Thread-1,5,main]执行逻辑
Thread[Thread-2,5,main]执行逻辑
Thread[main,5,main]继续
复制代码

第三に、信号量-Semaphore

スレッドの数は、同時にリソース制御にアクセス

おすすめ

転載: juejin.im/post/5d79b2aa6fb9a06b0a27a1ca