關於Condition
- Condition即條件,JDK描述:條件(也稱為條件佇列 或條件變數)為執行緒提供了一個含義,以便在某個狀態條件現在可能為 true 的另一個執行緒通知它之前,一直掛起該執行緒(即讓其“等待”)。因為訪問此共享狀態資訊發生在不同的執行緒中,所以它必須受保護,因此要將某種形式的鎖與該條件相關聯。等待提供一個條件的主要屬性是:以原子方式釋放相關的鎖,並掛起當前執行緒,就像 Object.wait 做的那樣。
Condition實質上是被繫結到一個鎖上。
- 為什麼使用Condition?
Condition的出現是為了更精細控制執行緒等待與喚醒,我們常熟悉的執行緒的等待與喚醒依靠的是Object物件的wait()和notify()/notifyAll()方法, 其只能形成一個等待佇列,而使用Condition可以根據條件形成多個等待佇列,對多個等待佇列進行操作,更加靈活。
- Condition例項化是通過一個Lock物件呼叫newCondition()方法來例項的,也正是Condition例項就和一個鎖物件繫結起來了。Condition實際上就是將 Object的wait、notify 和 notifyAll功能抽象出來,從而形成多個等待佇列。
Condition的使用
package com.zx.condition;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Demo {
private int singal;
ReentrantLock lock=new ReentrantLock();
Condition conditionA=lock.newCondition();
Condition conditionB=lock.newCondition();
Condition conditionC=lock.newCondition();
public void a(){
lock.lock();
while(singal!=0){
try {
conditionA.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("a");
singal++;
conditionB.signal();
lock.unlock();
}
public void b(){
lock.lock();
while(singal!=1){
try {
conditionB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("b");
singal++;
conditionC.signal();
lock.unlock();
}
public void c(){
lock.lock();
while(singal!=2){
try {
conditionC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("c");
singal=0;
conditionA.signal();
lock.unlock();
}
public static void main(String[] args) {
Demo demo=new Demo();
A a=new A(demo);
B b=new B(demo);
C c=new C(demo);
new Thread(a).start();
new Thread(b).start();
new Thread(c).start();
}
}
class A implements Runnable{
private Demo demo;
public A(Demo demo){
this.demo=demo;
}
public void run(){
while(true){
demo.a();
}
}
}
class B implements Runnable{
private Demo demo;
public B(Demo demo){
this.demo=demo;
}
public void run(){
while(true){
demo.b();
}
}
}
class C implements Runnable{
private Demo demo;
public C(Demo demo){
this.demo=demo;
}
public void run(){
while(true){
demo.c();
}
}
}
Condition的原理
https://www.cnblogs.com/zhengbin/p/6420984.html