複数のスレッドは共同操作であることがよくあります。たとえば、4 つのスレッドが電子商取引データの統計を四半期ごとに収集し、統計の完了後に要約されます。 4 つのスレッドがすべて実行されたことを確認するにはどうすればよいでしょうか? JDK1.5 によって提供される補助クラス CountDownLatch (
reduce count)、CyclicBarrier (循環バリア)、および Semaphore (セマフォ) を使用できます。
CountDownLatch の構築パラメーターは、連携するスレッドの数に応じて初期化されます。
public static void main(String[] args) throws InterruptedException { final int NUM=6; //定义总数量; CountDownLatch countDownLatch=new CountDownLatch(NUM); for (int i = 0; i < NUM; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"线程,已执行!"); //减少计数 countDownLatch.countDown(); },String.valueOf(i+1)).start(); } //等待所有任务完成 countDownLatch.await(); System.out.println("所有线程任务已经执行完成!"); }
はカウントを減らすことに似ています
public static void main(String[] args) { final int NUM = 6; //定义循环数量及循环完成后的任务(Runnable接口实现); CyclicBarrier cyclicBarrier = new CyclicBarrier(NUM, () -> { System.out.println("所有线程任务已经执行完成!"); }); for (int i = 0; i < NUM; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"线程,已执行!"); try { //等待点或障碍点,等待所有任务完成, cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } },String.valueOf(i+1)).start(); } }##3。信号の次元 セマフォ、スレッド、および信号は m:n (m>=n) です。
import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; /*信号灯 * 6个线程,抢占三个信号 * */ public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore=new Semaphore(3); for (int i = 0; i < 6; i++) { new Thread(()->{ try { //获取信号 semaphore.acquire(); System.out.println("线程:"+Thread.currentThread().getName()+"----获取信号"); int time = new Random().nextInt(5); System.out.println(("线程:"+Thread.currentThread().getName()+"----休眠"+time+"s!")); TimeUnit.SECONDS.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); }finally { // 释放信号 System.out.println("线程:"+Thread.currentThread().getName()+"---释放信号"); semaphore.release(); } },String.valueOf(i+1)).start(); } } }まず、スレッド 4、1、および 3 がシグナルを取得し、スレッド 1 がシグナルを解放した後、スレッド 2 がシグナルを取得します。スレッド 2 と 3 がシグナルを解放した後、スレッド 5 と 6 がシグナルを取得します。
以上がJava マルチスレッド共同ジョブで信号同期を実装するには、次の方法を使用できます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。