java Condition如何使用
2023-04-06 本文已影响0人
饱饱抓住了灵感
Java中的Condition是一个线程同步工具,它可以让线程在等待某个条件满足时进入等待状态,而不是忙等待。
Condition通常与Lock一起使用,它可以让线程在等待某个条件满足时释放锁,从而让其他线程可以获得锁并修改共享数据。
Condition的使用步骤如下:
- 创建一个Lock对象,用于保护共享数据。
- 创建一个Condition对象,用于等待条件满足。
- 在需要等待(使用
wihle)的地方,调用Condition的await()方法,线程会进入等待状态,并释放锁。 - 在满足条件(使用
wihle)的地方,调用Condition的signal()或signalAll()方法,唤醒等待的线程。 - 在唤醒等待的线程后,需要重新获取锁才能继续执行。
下面是一个简单的示例代码:
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()方法,来模拟对共享数据的操作