Home  >  Article  >  Java  >  To implement signal synchronization in Java multi-threaded collaborative jobs, you can use the following methods:

To implement signal synchronization in Java multi-threaded collaborative jobs, you can use the following methods:

WBOY
WBOYforward
2023-05-09 10:07:081312browse

    1. Signal synchronization

    Multiple threads are often collaborative operations. For example, four threads collect statistics on e-commerce data quarterly. After the statistics are completed, they are summarized. How to know that all four threads have been executed? We can use the auxiliary classes CountDownLatch (

    reduce count), CyclicBarrier (cyclic barrier), and Semaphore (semaphore) provided to us by JDK1.5.

    2. Based on the time dimension

    1. CountDownLatch

    The construction parameters of CountDownLatch are initialized according to the number of cooperating threads.

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

    To implement signal synchronization in Java multi-threaded collaborative jobs, you can use the following methods:

    2. CyclicBarrier

    is similar to reducing count

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

    To implement signal synchronization in Java multi-threaded collaborative jobs, you can use the following methods:

    ##3. Based on the signal dimension

    Semaphore, thread and signal are m:n, where 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();
            }
        }
    }

    First, threads 4, 1, and 3 get the signal. After thread 1 releases the signal, thread 2 gets the signal. After threads 2 and 3 release the signal, threads 5 and 6 get the signal.

    To implement signal synchronization in Java multi-threaded collaborative jobs, you can use the following methods:

    The above is the detailed content of To implement signal synchronization in Java multi-threaded collaborative jobs, you can use the following methods:. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete