Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作。
- Condition是个接口,基本的方法就是await()和signal()方法
- Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
- 调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用
- Conditon中的await()对应Object的wait()
- Condition中的signal()对应Object的notify()
- Condition中的signalAll()对应Object的notifyAll()
多线程下使用
public class ConditionTest2 {
private final static Lock lock = new ReentrantLock();
private final static Condition PRODUCE_COND = lock.newCondition();
private final static Condition CONSUME_COND = lock.newCondition();
private final static LinkedList<Long> TIMESTAMP_POOL = new LinkedList<>();
private final static int MAX_CAPACITY = 100;
public static void produce(){
try {
lock.lock();
while(TIMESTAMP_POOL.size() >= MAX_CAPACITY){
PRODUCE_COND.await();
}
long value = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "-p-" + value);
TIMESTAMP_POOL.addLast(value);
CONSUME_COND.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void consume(){
try {
lock.lock();
while (TIMESTAMP_POOL.isEmpty()){
CONSUME_COND.await();
}
long value = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "-C-" + value);
PRODUCE_COND.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
// 测试的时候,线程中请加上时间sleep
new Thread(()->{
for (;;){
produce();
}
}).start();
new Thread(()->{
for (;;){
produce();
}
}).start();
new Thread(()->{
for (;;){
consume();
}
}).start();
new Thread(()->{
for (;;){
consume();
}
}).start();
}
}
https://blog.csdn.net/fuyuwei2015/article/details/72602182
这里讲的很详细