Java线程并发工具类CountDownLatch原理及用法
简介
CountDownLatch是一种非常实用的java线程同步工具类,主要作用是允许一个或多个线程一直等待,在其他线程执行完一组操作之后才执行。
CountDownLatch主要有两个方法:
* countDown() : 对计数器进行操作,将计数器的值减少1
* await() : 调用该方法的线程等待计数器为0,也就是其他线程执行完毕后再执行
原理
CountDownLatch原理主要基于AQS(AbstractQueuedSynchronizer)的共享模式和共享锁实现。
当main线程调用CountDownLatch的await方法时,如果计数器不为0,则main线程会进入等待状态,同时计数器对应的线程会继续执行;当计数器减少到0时,main线程便会被唤醒,继续执行后面的代码。
用法
场景1:实现多个线程并发执行
当需要多个线程并发执行任务,需要在一定条件下一起执行,可以使用CountDownLatch实现。
示例代码:
public class CountDownLatchTest {
private static final int THREAD_COUNT = 5;
private static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(THREAD_COUNT);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < THREAD_COUNT; i++) {
Thread thread = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行完毕!");
COUNT_DOWN_LATCH.countDown();
});
thread.start();
}
COUNT_DOWN_LATCH.await();
System.out.println("所有线程执行完毕!");
}
}
在上述代码中,首先定义了一个COUNT_DOWN_LATCH的CountDownLatch对象,并初始化计数器为THREAD_COUNT=5;然后启动了5个线程,每个线程执行完成后都会调用COUNT_DOWN_LATCH对象的countDown方法对计数器进行减一操作;main线程通过调用COUNT_DOWN_LATCH.await()方法来等待所有线程执行完毕,这样就可以保证所有线程都执行完毕后再执行后续的代码。
场景2:实现主线程等待子线程完成任务
当主线程需要等待子线程完成任务后再执行时,可以使用CountDownLatch来实现。
示例代码:
public class CountDownLatchTest {
private static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(1);
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "开始执行任务...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行任务完成!");
COUNT_DOWN_LATCH.countDown();
});
thread.start();
System.out.println(Thread.currentThread().getName() + "等待子线程执行任务...");
try {
COUNT_DOWN_LATCH.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有任务完成,主线程开始执行!");
}
}
在上述代码中,首先定义一个COUNT_DOWN_LATCH的CountDownLatch对象,并初始化计数器为1;然后启动了一个线程thread,该线程执行完成后会调用COUNT_DOWN_LATCH对象的countDown方法对计数器进行减一操作;主线程通过调用COUNT_DOWN_LATCH.await()方法来等待子线程执行完毕,这样就可以保证主线程在子线程执行完毕后再执行后续的代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程并发工具类CountDownLatch原理及用法 - Python技术站