Java 提供了丰富的并发工具类,位于 java.util.concurrent
包中,用于简化多线程编程并提高性能。以下是常用的并发工具类及其用途:
1. 线程池相关
ExecutorService
:- 用于管理线程池,支持提交任务并返回
Future
对象。 - 常用实现类:
ThreadPoolExecutor
、ScheduledThreadPoolExecutor
。
- 用于管理线程池,支持提交任务并返回
Executors
:- 工厂类,用于创建不同类型的线程池。
- 常用方法:
newFixedThreadPool(int nThreads)
:固定大小的线程池。newCachedThreadPool()
:可缓存的线程池。newSingleThreadExecutor()
:单线程的线程池。newScheduledThreadPool(int corePoolSize)
:支持定时任务的线程池。
2. 同步工具
CountDownLatch
:- 允许一个或多个线程等待其他线程完成操作。
- 使用场景:主线程等待多个子线程完成任务。
CyclicBarrier
:- 让一组线程相互等待,达到屏障点时继续执行。
- 使用场景:多线程分阶段任务。
Semaphore
:- 控制同时访问资源的线程数量。
- 使用场景:限流、资源池管理。
Phaser
:- 更灵活的同步工具,支持分阶段的任务协调。
- 使用场景:复杂的多线程任务协调。
3. 线程安全的集合
ConcurrentHashMap
:- 线程安全的哈希表,性能优于
Hashtable
。
- 线程安全的哈希表,性能优于
CopyOnWriteArrayList
:- 线程安全的列表,适合读多写少的场景。
BlockingQueue
:- 线程安全的队列,支持阻塞操作。
- 常用实现类:
ArrayBlockingQueue
:基于数组的有界队列。LinkedBlockingQueue
:基于链表的可选有界队列。PriorityBlockingQueue
:支持优先级的无界队列。SynchronousQueue
:不存储元素的队列,用于直接传递任务。
4. 原子变量
AtomicInteger
、AtomicLong
、AtomicBoolean
:- 提供原子操作的整型、长整型和布尔型变量。
AtomicReference
:- 提供原子操作的对象引用。
AtomicStampedReference
:- 解决 ABA 问题的原子引用。
5. 锁相关
ReentrantLock
:- 可重入锁,比
synchronized
更灵活,支持公平锁和非公平锁。
- 可重入锁,比
ReentrantReadWriteLock
:- 读写锁,支持读操作并发,写操作独占。
StampedLock
:- 更高效的读写锁,支持乐观读。
6. Future 和 CompletableFuture
Future
:- 表示异步计算的结果,支持获取计算结果或取消任务。
CompletableFuture
:- 更强大的异步编程工具,支持链式调用和组合多个异步任务。
示例代码
// 使用 CountDownLatch
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
new Thread(() -> {
System.out.println("Task completed");
latch.countDown();
}).start();
}
latch.await(); // 等待所有任务完成
// 使用 ConcurrentHashMap
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
// 使用 CompletableFuture
CompletableFuture.supplyAsync(() -> "Hello")
.thenApplyAsync(s -> s + " World")
.thenAccept(System.out::println);
总结
Java 并发工具类提供了强大的多线程编程支持,涵盖了线程池管理、同步控制、线程安全集合、原子操作、锁机制以及异步任务处理等方面。合理使用这些工具类可以显著提高程序的并发性能和可靠性。
THE END
暂无评论内容