返回
并发工具类:管理线程的实用工具
后端
2023-12-31 12:24:46
1. Semaphore
Semaphore是一种用于控制对共享资源的访问的工具。它允许一定数量的线程同时访问共享资源,而当超过该数量的线程试图访问共享资源时,它们将被阻塞,直到有可用资源为止。Semaphore的用法非常简单,只需要创建一个Semaphore对象,并指定其初始许可证数量即可。
// 创建一个初始许可证数量为1的Semaphore
Semaphore semaphore = new Semaphore(1);
// 线程1尝试获取许可证
semaphore.acquire();
// 线程2尝试获取许可证
semaphore.acquire();
// 线程3尝试获取许可证,但被阻塞
semaphore.acquire();
// 线程1释放许可证
semaphore.release();
// 线程2释放许可证
semaphore.release();
// 线程3获取许可证
semaphore.acquire();
2. CyclicBarrier
CyclicBarrier是一种用于等待一组线程都到达某个屏障的工具。当所有线程都到达屏障时,CyclicBarrier将释放所有线程,继续执行。CyclicBarrier的用法也非常简单,只需要创建一个CyclicBarrier对象,并指定其等待的线程数量即可。
// 创建一个等待3个线程的CyclicBarrier
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
// 线程1到达屏障
cyclicBarrier.await();
// 线程2到达屏障
cyclicBarrier.await();
// 线程3到达屏障
cyclicBarrier.await();
// 所有线程都到达屏障,继续执行
3. CountDownLatch
CountDownLatch是一种用于等待一组任务都完成的工具。当所有任务都完成时,CountDownLatch将释放所有等待的线程,继续执行。CountDownLatch的用法也非常简单,只需要创建一个CountDownLatch对象,并指定其等待的任务数量即可。
// 创建一个等待3个任务的CountDownLatch
CountDownLatch countDownLatch = new CountDownLatch(3);
// 任务1完成
countDownLatch.countDown();
// 任务2完成
countDownLatch.countDown();
// 任务3完成
countDownLatch.countDown();
// 所有任务都完成,继续执行
countDownLatch.await();
4. Executors
Executors是一种创建线程池的工具。线程池是一种管理线程的机制,可以提高应用程序的性能和可扩展性。Executors提供了多种创建线程池的方法,包括:
- newFixedThreadPool:创建一个固定大小的线程池,该线程池中的线程数量不会动态调整。
- newCachedThreadPool:创建一个可伸缩的线程池,该线程池中的线程数量可以根据需要动态调整。
- newSingleThreadExecutor:创建一个只有一个线程的线程池,该线程池中的线程可以顺序执行任务。
// 创建一个固定大小的线程池,该线程池中的线程数量为3
ExecutorService executorService = Executors.newFixedThreadPool(3);
// 提交任务到线程池
executorService.submit(new Runnable() {
@Override
public void run() {
// 执行任务
}
});
// 提交任务到线程池
executorService.submit(new Runnable() {
@Override
public void run() {
// 执行任务
}
});
// 等待所有任务执行完成
executorService.shutdown();
5. 总结
Semaphore、CyclicBarrier、CountDownLatch和Executors是Java中常用的并发工具类。了解这些工具的功能和用法,可以帮助您编写更健壮、更可扩展的并发程序。