在并发编程中,Java提供了许多有用的工具和类来简化开发和处理线程之间的并发。Java并发工具包(Java Concurrency Utilities)是Java SE 5中引入的一组类,用于帮助开发人员更容易地构建多线程应用程序。这篇博客将详细介绍Java并发工具包中的一些重要工具和类。
1. CountDownLatch(倒计时门闩)
CountDownLatch
是一个同步工具类,它可以使一个或多个线程等待其他线程执行完毕后再继续执行。它通过一个计数器来实现,初始值可以设置为任意整数。在主线程中调用CountDownLatch.await()
方法会阻塞主线程,直到计数器变为0,然后主线程继续执行。
CountDownLatch latch = new CountDownLatch(3);
Runnable task = new Runnable() {
public void run() {
// 线程执行的任务
latch.countDown();
}
};
// 启动3个线程执行任务
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
latch.await(); // 阻塞主线程,直到计数器变为0
2. CyclicBarrier(循环屏障)
CyclicBarrier
也是一个同步工具类,用于在多个线程之间设置一个同步点。可以将其想象成一个屏障,所有线程必须同时到达这个屏障才能继续执行。与CountDownLatch
不同,CyclicBarrier
的计数器可以重置为初始值,并且可以在所有线程到达屏障时执行一个回调函数。
CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
public void run() {
// 所有线程到达屏障后执行的任务
}
});
Runnable task = new Runnable() {
public void run() {
// 线程执行的任务
try {
barrier.await(); // 线程等待其他线程到达屏障
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
};
// 启动3个线程执行任务
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
3. Semaphore(信号量)
Semaphore
是一个计数信号量,它可以限制同时访问某个资源的线程数。可以将它看作是一个向信号量中存入许可证(permit),线程需要许可证才能访问资源。如果所有许可证都被使用,那么线程需要等待,直到有许可证可用。当线程使用完资源后,需要释放许可证,以便其他线程可以使用。
Semaphore semaphore = new Semaphore(3); // 同时访问资源的线程数为3
Runnable task = new Runnable() {
public void run() {
try {
semaphore.acquire(); // 获取许可证
// 访问共享资源
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放许可证
}
}
};
// 启动多个线程访问共享资源
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
4. Executor(执行器框架)
Java提供了Executor
接口和Executors
工具类,用于管理和执行线程池中的线程。使用线程池可以避免频繁创建和销毁线程的开销,并且可以控制同时执行的线程数。
Executor executor = Executors.newFixedThreadPool(3); // 创建固定大小的线程池
Runnable task = new Runnable() {
public void run() {
// 线程执行的任务
}
};
// 提交任务给线程池执行
executor.execute(task);
executor.execute(task);
executor.execute(task);
// 关闭线程池
executor.shutdown();
5. ConcurrentHashMap(并发哈希表)
ConcurrentHashMap
是HashMap
的线程安全版本,它允许多个线程同时访问并修改哈希表。与HashMap
不同的是,ConcurrentHashMap
使用了分段锁(Segment),不同的线程可以同时访问不同的分段,从而提高了并发性能。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key1", 1);
map.put("key2", 2);
map.put("key3", 3);
int value = map.get("key1"); // 获取值
map.remove("key2"); // 删除键值对
结论
Java并发工具包提供了许多强大的工具和类,用于简化并发编程的开发和处理。本文介绍了CountDownLatch
、CyclicBarrier
、Semaphore
、Executor
和ConcurrentHashMap
等常用的并发工具,希望能够帮助开发人员更好地处理多线程应用程序中的并发问题。
本文来自极简博客,作者:云端漫步,转载请注明原文链接:Java并发工具包:并发编程利器详解