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

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

WBOY
WBOY앞으로
2023-05-09 10:07:081273검색

    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으로 문의하시기 바랍니다. 삭제