CountDownLatch的基本使用

  1. public static void main(String[] args) {
  2. CountDownLatch countDownLatch = new CountDownLatch(3);
  3. IntStream.range(0, 3).forEach(i -> new Thread(() -> {
  4. try {
  5. Thread.sleep(2000);
  6. System.out.println("hello");
  7. } catch (InterruptedException ex) {
  8. ex.printStackTrace();
  9. } finally {
  10. countDownLatch.countDown();
  11. }
  12. }).start());
  13. System.out.println("启动子线程完毕");
  14. try {
  15. countDownLatch.await();
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println("主线程执行完毕");
  20. }

CyclicBarrierd的基本使用

  1. public static void main(String[] args) {
  2. CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
  3. System.out.println("hello world");
  4. });
  5. for (int i = 0; i < 2; ++i) {
  6. for (int n = 0; n < 3; ++n) {
  7. new Thread(() -> {
  8. try {
  9. Thread.sleep((long) (Math.random() * 2000));
  10. int randomInt = new Random().nextInt(500);
  11. System.out.println("hello " + randomInt);
  12. cyclicBarrier.await();
  13. System.out.println("world " + randomInt);
  14. } catch (Exception ex) {
  15. ex.printStackTrace();
  16. }
  17. }).start();
  18. }
  19. }
  20. }