ホームページ  >  記事  >  Java  >  Java マルチスレッド共同ジョブで信号同期を実装するには、次の方法を使用できます。

Java マルチスレッド共同ジョブで信号同期を実装するには、次の方法を使用できます。

WBOY
WBOY転載
2023-05-09 10:07:081312ブラウズ

    1. 信号の同期

    複数のスレッドは共同操作であることがよくあります。たとえば、4 つのスレッドが電子商取引データの統計を四半期ごとに収集し、統計の完了後に要約されます。 4 つのスレッドがすべて実行されたことを確認するにはどうすればよいでしょうか? JDK1.5 によって提供される補助クラス CountDownLatch (

    reduce count)、CyclicBarrier (循環バリア)、および Semaphore (セマフォ) を使用できます。

    2. 時間ディメンションに基づく

    1. CountDownLatch

    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("所有线程任务已经执行完成!");
        }

    Java マルチスレッド共同ジョブで信号同期を実装するには、次の方法を使用できます。

    2. CyclicBarrier

    はカウントを減らすことに似ています

     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();
            }
        }

    Java マルチスレッド共同ジョブで信号同期を実装するには、次の方法を使用できます。

    ##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 マルチスレッド共同ジョブで信号同期を実装するには、次の方法を使用できます。

    以上がJava マルチスレッド共同ジョブで信号同期を実装するには、次の方法を使用できます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。