> Java > java지도 시간 > 본문

Java 다중 스레드 공동 작업에서 신호 동기화를 구현하려면 다음 방법을 사용할 수 있습니다.

WBOY
풀어 주다: 2023-05-09 10:07:08
앞으로
1328명이 탐색했습니다.

    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입니다.

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿