项目中使用到多线程任务,由于多线程任务需要同步运行,想到使用CountDownLatch,现在来记录下CountDownLatch使用细节
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行
测试案例 1
CountDownLatch countDownLatch = new CountDownLatch(3); for(int i=0;i<3;i++){ new Thread(() -> { System.out.println(Thread.currentThread().getName() + " 运行"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } }).start(); } try { countDownLatch.await(); // boolean await = countDownLatch.await(10,TimeUnit.SECONDS); // if(await){ // System.out.println("子线程运行结束!"); // } System.out.println("子线程运行结束!"); } catch (InterruptedException e) { e.printStackTrace(); }
结果:正常输出子"线程运行结束",await 方法在countDownLatch未0时候唤醒,执行下面语句
测试案例 2
CountDownLatch countDownLatch = new CountDownLatch(3); for(int i=0;i<2;i++){ new Thread(() -> { System.out.println(Thread.currentThread().getName() + " 运行"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } }).start(); } try { countDownLatch.await(); // boolean await = countDownLatch.await(10,TimeUnit.SECONDS); // if(await){ // System.out.println("子线程运行结束!"); // } System.out.println("子线程运行结束!"); } catch (InterruptedException e) { e.printStackTrace(); }
结果:执行2个线程之后一直处于阻塞, countDownLatch.await()下面语句没法执行,因为现在countDownLatch值为1
测试案例 3
CountDownLatch countDownLatch = new CountDownLatch(3); for(int i=0;i<2;i++){ new Thread(() -> { System.out.println(Thread.currentThread().getName() + " 运行"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } }).start(); } try { //countDownLatch.await(); countDownLatch.await(10,TimeUnit.SECONDS); System.out.println("子线程运行结束!"); } catch (InterruptedException e) { e.printStackTrace(); }
结果:执行2个线程之后,阻塞10s后触发超时,执行下面语句,输出"子线程运行结束"
总结countDownLatch在值为0或者设置了超时限制,可以由阻塞转为执行