Java多线程同步问题:CountDownLatch和Semaphore的实际应用示例

原创 青旅半醒 2024-12-11 16:57 62阅读 0赞

CountDownLatch和Semaphore都是Java中用于管理多个线程同步的工具。下面我们将通过两个实际应用场景来演示它们的使用。

  1. 网站请求处理
    假设有一个web服务,它会接收来自客户端的请求并进行处理。我们可以创建一个Thread来处理每个请求,并用CountDownLatch来协调这些线程:
  1. // 客户端向服务发送请求
  2. public class Client {
  3. public void sendRequest() {
  4. // 创建CountDownLatch实例,初始值为1
  5. final CountDownLatch latch = new CountDownLatch(1);
  6. // 创建一个Thread来处理这个请求
  7. Thread thread = new Thread(() -> {
  8. // 在这里进行请求处理
  9. // 一旦处理完成,调用latch.countDown()
  10. try {
  11. latch.await();
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }));
  16. // 启动线程来处理请求
  17. thread.start();
  18. // 当所有请求都被处理完成后,释放CountDownLatch
  19. latch.countDown();
  20. }
  21. }
  22. // 服务端处理每个客户端的请求
  23. public class Server {
  24. public void processRequest() {
  25. // 模拟请求处理逻辑,例如读取请求数据、进行计算等
  26. System.out.println("Received request, processing...");
  27. // 为了保证线程安全,这里使用Semaphore来限制同时处理的请求数量
  28. Semaphore semaphore = new Semaphore(1); // 限制同时只有一个请求被处理
  29. // 将需要同步的任务包装到一个新的Runnable对象中
  30. Runnable worker = () -> {
  31. try {
  32. // 获取许可证(也就是获取锁)
  33. semaphore.acquire();
  34. // 进行请求的处理逻辑,例如读取数据、进行计算等
  35. System.out.println("Processing request...");
  36. // 一旦处理完成,释放许可证(即解锁)
  37. semaphore.release();
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. };
  42. // 启动一个新的线程来执行请求的处理逻辑
  43. new Thread(worker).start();
  44. }
  45. }
  1. 任务调度
    假设有一个系统需要定期执行一些任务,可以使用CountDownLatch和Semaphore来协调多个线程按照预设的时间表进行任务。

以上两种场景只是CountDownLatch和Semaphore应用的冰山一角。在实际项目中,它们可以根据需求灵活运用。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,62人围观)

还没有评论,来说两句吧...

相关阅读