21xrx.com
2025-04-15 04:07:28 Tuesday
文章检索 我的文章 写文章
Java Condition的用法
2023-10-02 12:19:43 深夜i     12     0
Java Condition 条件 控制流程 线程同步 等待和通知

Java Condition是一个用于线程通信的工具类,它可以让不同的线程在特定条件下进行等待或通知。它提供了一种机制,使得线程可以有序地执行。在多线程编程中,条件是非常重要的,因为它可以让线程按照预期的顺序执行,并且避免竞争条件。通过使用Java Condition,可以更加精确和灵活地控制线程的执行。

Java Condition是通过与Lock配合使用的,它通常是Lock的一部分。在使用Condition之前,需要先获得一个Lock对象。然后,通过Lock对象的newCondition方法创建一个Condition对象。Condition对象提供了await()和signal()等方法,分别用于线程的等待和通知。

在Java Condition中,等待和通知是通过Condition对象来实现的。在等待的时候,线程会释放它所持有的锁,并进入等待状态。被通知后,线程会重新竞争锁,并继续执行。这种等待和通知的机制可以避免线程持续竞争锁资源的问题,提高程序的效率。

下面是一个简单的示例,演示了Java Condition的用法:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionDemo {
  private Lock lock = new ReentrantLock();
  private Condition condition = lock.newCondition();
  private boolean flag = false;
  public void printNumber() {
    try {
      lock.lock();
      while (!flag) {
        condition.await();
      }
      System.out.println("1");
      flag = false;
      condition.signal();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
  public void printLetter() {
    try {
      lock.lock();
      while (flag) {
        condition.await();
      }
      System.out.println("A");
      flag = true;
      condition.signal();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
  public static void main(String[] args) {
    ConditionDemo conditionDemo = new ConditionDemo();
    Thread t1 = new Thread(() -> {
      for (int i = 0; i < 10; i++) {
        conditionDemo.printNumber();
      }
    });
    Thread t2 = new Thread(() -> {
      for (int i = 0; i < 10; i++) {
        conditionDemo.printLetter();
      }
    });
    t1.start();
    t2.start();
  }
}

在上述示例中,ConditionDemo类中有一个flag变量用于交替打印数字和字母。printNumber()方法和printLetter()方法通过调用await()方法和signal()方法来实现线程的等待和通知。在main()方法中创建了两个线程t1和t2,分别调用printNumber()和printLetter()方法,实现了数字和字母的交替打印。

通过使用Java Condition,可以更加方便地实现线程之间的通信和同步。它提供了一种灵活的方式,可以更加精确地控制线程的执行顺序和条件,避免了常见的竞争条件和死锁问题。在多线程编程中,使用Java Condition可以提高程序的效率和可靠性。

  
  

评论区