Java多线程同步工具类:Lock和Condition实例

原创 不念不忘少年蓝@ 2024-10-07 05:36 190阅读 0赞

在Java中,我们通常使用java.util.concurrent.locks.Lock接口来实现线程的同步。而java.util.concurrent.locks.Condition接口则用于实现线程间的通信。

以下是一个简单的例子,展示了如何创建LockCondition实例:

  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReentrantLock; // 这里使用了可重入锁
  3. import java.util.concurrent.locks.Condition;
  4. public class MultiThreadSync {
  5. private Lock lock = new ReentrantLock(); // 创建锁
  6. private Condition condition = lock.newCondition(); // 创建条件
  7. public void printWhenReady() throws InterruptedException {
  8. lock.lock(); // 获取锁
  9. try {
  10. if (!condition.await(5, TimeUnit.SECONDS))) { // 如果5秒后没有满足条件,则抛出InterruptedException
  11. System.out.println("Ready after 5 seconds");
  12. }
  13. else {
  14. System.out.println("Ready when condition matched");
  15. }
  16. } finally {
  17. lock.unlock(); // 释放锁
  18. }
  19. }
  20. public static void main(String[] args) throws InterruptedException {
  21. MultiThreadSync sync = new MultiThreadSync();
  22. Thread producer = new Thread(() -> {
  23. try {
  24. for (int i = 0; i < 10; i++) {
  25. System.out.println("Produced: " + i);
  26. if (i == 5) { // 当生产到第五个元素时,通知消费者
  27. sync.condition.signalAll(); // 使用signalAll()方法一次性唤醒所有等待的线程
  28. }
  29. Thread.sleep(100); // 模拟耗时操作
  30. }
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. })});
  35. Thread consumer = new Thread(() -> {
  36. try {
  37. sync.printWhenReady(); // 当条件匹配时,打印"Ready when condition matched"
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. System.out.println("Consumer thread exiting...");
  42. })});
  43. producer.start(); // 启动生产者线程
  44. consumer.start(); // 启动消费者线程
  45. // 主程序等待所有线程执行完毕
  46. while (!producer.isDone() || !consumer.isDone()) {
  47. try {
  48. Thread.sleep(1000); // 模拟程序繁忙,减少主线程的占用
  49. } catch (InterruptedException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54. }

在这个例子中,我们创建了一个Lock实例(代表一把锁)和一个Condition实例(代表一个条件)。生产者线程会尝试获取锁并满足条件,然后释放锁。消费者线程则会在满足条件时打印一条消息,并退出。

main方法中,我们启动了生产者线程和消费者线程,并等待所有线程执行完毕。

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

发表评论

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

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

相关阅读