在Java并发编程中,JDK自带的java.util.concurrent包提供了丰富的并发库与工具类,能够帮助开发者更安全地管理线程、提升程序吞吐量并降低出错概率。合理使用这些工具,可以避免重复造轮子以及手写锁带来的复杂性。

一、线程池相关工具
线程池是最常用的并发工具之一,位于java.util.concurrent包中。通过Executors或ThreadPoolExecutor可以创建不同类型的线程池。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PoolDemo {
public static void main(String[] args) {
// 创建固定大小的线程池
ExecutorService pool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
int taskId = i;
pool.submit(() -> {
System.out.println("任务" + taskId + "由" + Thread.currentThread().getName() + "执行");
});
}
pool.shutdown();
}
}
二、同步辅助类
1. CountDownLatch
CountDownLatch用于让一个线程等待其他多个线程完成操作后再继续执行,类似于计数器。
import java.util.concurrent.CountDownLatch;
public class LatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(2);
new Thread(() -> {
System.out.println("线程1执行");
latch.countDown();
}).start();
new Thread(() -> {
System.out.println("线程2执行");
latch.countDown();
}).start();
latch.await();
System.out.println("全部完成,主线程继续");
}
}
2. CyclicBarrier
CyclicBarrier可以让一组线程互相等待,到达屏障点后再一起继续,且可循环使用。
三、并发集合与队列
ConcurrentHashMap是线程安全的哈希表,采用分段或节点级锁提升并发度。BlockingQueue常用于生产者消费者模型。
| 工具类 | 主要用途 |
|---|---|
| ConcurrentHashMap | 高并发场景下的键值存储 |
| ArrayBlockingQueue | 有界阻塞队列,线程间传递数据 |
| Semaphore | 限制同时访问资源的线程数 |
四、信号量Semaphore
Semaphore用于控制同时访问特定资源的线程数量,常用于流量控制。
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore sem = new Semaphore(2);
for (int i = 0; i < 4; i++) {
new Thread(() -> {
try {
sem.acquire();
System.out.println(Thread.currentThread().getName() + "获得许可");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
sem.release();
}
}).start();
}
}
}
五、总结
Java并发库与工具类覆盖了线程管理、同步协调、安全集合和流量控制等方面。实际开发中应根据业务特点选择合适的工具,例如任务量大且独立时用线程池,需要线程间同步用CountDownLatch或CyclicBarrier,共享数据读写多用ConcurrentHashMap,资源受限访问用Semaphore。