Java多线程同步问题:CountDownLatch和Semaphore的实际应用示例
CountDownLatch和Semaphore都是Java中用于管理多个线程同步的工具。下面我们将通过两个实际应用场景来演示它们的使用。
- 网站请求处理:
假设有一个web服务,它会接收来自客户端的请求并进行处理。我们可以创建一个Thread来处理每个请求,并用CountDownLatch来协调这些线程:
// 客户端向服务发送请求
public class Client {
public void sendRequest() {
// 创建CountDownLatch实例,初始值为1
final CountDownLatch latch = new CountDownLatch(1);
// 创建一个Thread来处理这个请求
Thread thread = new Thread(() -> {
// 在这里进行请求处理
// 一旦处理完成,调用latch.countDown()
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}));
// 启动线程来处理请求
thread.start();
// 当所有请求都被处理完成后,释放CountDownLatch
latch.countDown();
}
}
// 服务端处理每个客户端的请求
public class Server {
public void processRequest() {
// 模拟请求处理逻辑,例如读取请求数据、进行计算等
System.out.println("Received request, processing...");
// 为了保证线程安全,这里使用Semaphore来限制同时处理的请求数量
Semaphore semaphore = new Semaphore(1); // 限制同时只有一个请求被处理
// 将需要同步的任务包装到一个新的Runnable对象中
Runnable worker = () -> {
try {
// 获取许可证(也就是获取锁)
semaphore.acquire();
// 进行请求的处理逻辑,例如读取数据、进行计算等
System.out.println("Processing request...");
// 一旦处理完成,释放许可证(即解锁)
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
// 启动一个新的线程来执行请求的处理逻辑
new Thread(worker).start();
}
}
- 任务调度:
假设有一个系统需要定期执行一些任务,可以使用CountDownLatch和Semaphore来协调多个线程按照预设的时间表进行任务。
以上两种场景只是CountDownLatch和Semaphore应用的冰山一角。在实际项目中,它们可以根据需求灵活运用。
还没有评论,来说两句吧...