关于java:多线程控制-countDownLatchCyclicBarrierSemaphore-总结

1次阅读

共计 1613 个字符,预计需要花费 5 分钟才能阅读完成。

countDownLatch

作用:用于管制多线程执行协调,即线程先后依赖的问题。如主线程须要期待多个子线程执行实现后继续执行。

示例代码(代码中关键点正文)

public class CountDownTest {public static void main(String[] args) {long start = System.currentTimeMillis();
        System.out.println("start =" + start);
        int num = 100;
        LinkedBlockingQueue lbq = new LinkedBlockingQueue();
        lbq.stream().count();
        final CountDownLatch cdl = new CountDownLatch(num);// 参数为线程个数
        for (int i = 0; i < num; i++) {new Thread(() -> {System.out.println("thread:"+num);
                cdl.countDown();// 此办法是 CountDownLatch 的线程数 -1}).start();}
        try {cdl.await();
        }catch (InterruptedException e){e.printStackTrace();
        }
        // 通过 await() 调用,保障以下输入是最开端输入
        long end = System.currentTimeMillis();
        System.out.println("end =" + end);
        System.out.println("use" + (end - start));
    }
}

CyclicBarrier

作用:管制多个线程对立工夫执行

示例代码(代码中关键点正文)

public class CyclicBarrierTest {public static void main(String[] args) {
        int num = 5;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(num);
        for(int i = 0;i<num;i++){new Thread(() -> {
                try {Thread.sleep(num*1000);
                    System.out.println(new Date().getTime());
                    // 以下调用将会使改线程参加到栅栏管制中,期待所有栅栏内线程全副初始化实现一起执行
                    // 预期后果为多个线程输入的工夫戳完全一致
                    cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();
                } catch (BrokenBarrierException e) {e.printStackTrace();
                }
            }).start();}
    }
}

Semaphore

作用:管制多个线程同时执行的个数。相似工人和操作台,工人数量大于操作台

示例代码(代码中关键点正文)

public class SemaphoreTest {public static void main(String[] args) {
        int num = 3; // 可执行线程数(操作台)int numThread = 20; // 能参加的线程数(工人)Semaphore semaphore = new Semaphore(num);
            for(int i = 0;i<numThread;i++){
                int no = i;
                new Thread(()->{
                    try {semaphore.acquire(); // 工人上工,占用一个操作台
                    System.out.println("工号:"+ no +"的工人在干活");
                    Thread.sleep(5000);
                    System.out.println("工号:"+ no +"的工人上班了");
                    semaphore.release(); // 工人上班,开释操作台}catch (Exception e){e.printStackTrace();
                    }
                }).start();}
    }
}
正文完
 0