理解高并发(13).完成后给我报告countDownLatch

xiaoxiao2021-02-28  77

概念 : 固定多少个任务,每个线程执行完一次做一次减操作, 直至任务数为0,主线程才继续往下执行。 常用方法: //声明任务个数为20 final CountDownLatch latch = new CountDownLatch(20); // 任务数减1 latch.countDown(); //阻塞,直到任务数为0才被唤醒继续执行 latch.await(); 使用场景: 所有子线程完成后主线程才继续往下执行。 适用于后在的工作依赖于前面的工作而执行。 原理: 底层也是用wait/notify机制实现, latch.await实际上相当于synchronized(latch){ this.wait(); } 而在countDown里面每调用一次值都为-1,直到为0为止,为0则触发notify(); 示例源码: 20个线程运行完毕后通知主线程,主线获得通知后才会继续往下执行。 final CountDownLatch latch = new CountDownLatch(20); for(int i=0; i<20; i++){ Thread t = new Thread(new Runnable(){ public void run(){ try { semp.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } SemaphoreTest.pool.add(Thread.currentThread()); bank.withDraw(); SemaphoreTest.pool.remove(Thread.currentThread()); semp.release(); latch.countDown(); } }, "thread_" + i); threads[i] = t; t.start(); } try { latch.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("============over=========");
转载请注明原文地址: https://www.6miu.com/read-83717.html

最新回复(0)