美文网首页
java Condition如何使用

java Condition如何使用

作者: 饱饱抓住了灵感 | 来源:发表于2023-04-06 10:46 被阅读0次

Java中的Condition是一个线程同步工具,它可以让线程在等待某个条件满足时进入等待状态,而不是忙等待。

Condition通常与Lock一起使用,它可以让线程在等待某个条件满足时释放锁,从而让其他线程可以获得锁并修改共享数据。

Condition的使用步骤如下:

  1. 创建一个Lock对象,用于保护共享数据。
  2. 创建一个Condition对象,用于等待条件满足。
  3. 在需要等待(使用wihle)的地方,调用Condition的await()方法,线程会进入等待状态,并释放锁。
  4. 在满足条件(使用wihle)的地方,调用Condition的signal()或signalAll()方法,唤醒等待的线程。
  5. 在唤醒等待的线程后,需要重新获取锁才能继续执行。

下面是一个简单的示例代码:

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 int count = 0;

    public void increment() {
        lock.lock();
        try {
            while (count == 10) {
                condition.await();
            }
            count++;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
            condition.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void decrement() {
        lock.lock();
        try {
            while (count == 0) {
                condition.await();
            }
            count--;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
            condition.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ConditionDemo demo = new ConditionDemo();
        new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                demo.increment();
            }
        }, "A").start();

        new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                demo.decrement();
            }
        }, "B").start();
    }
}

在这个示例中,我们创建了一个Lock对象和一个Condition对象,用于保护和等待共享数据。
在increment()和decrement()方法中,我们使用while循环来等待条件满足,如果条件不满足,就调用Condition的await()方法进入等待状态,并释放锁。
在满足条件的地方,我们调用Condition的signalAll()方法唤醒等待的线程。在唤醒等待的线程后,需要重新获取锁才能继续执行。
最后,我们创建两个线程分别调用increment()和decrement()方法,来模拟对共享数据的操作

相关文章

网友评论

      本文标题:java Condition如何使用

      本文链接:https://www.haomeiwen.com/subject/cgweddtx.html