java多執行緒學習之Condition,實現喚醒指定的部分執行緒
阿新 • • 發佈:2019-01-01
package learn.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
Condition,實現喚醒指定的部分執行緒
*/
public class Demo15 {
static Lock lock = new ReentrantLock();
static int count = 0;
static Condition conditionA = lock .newCondition();// 必須配合lock.lock()使用
static Condition conditionB = lock.newCondition();// 必須配合lock.lock()使用
public static void main(String[] args) {
Thread t1 = new Thread() {
@Override
public void run() {
lock.lock();
if (count < 5 ) {
System.out.println("執行緒1未達到業務要求,暫停中,等待執行緒2處理到達到要求後喚醒");
try {
conditionA.await();// 暫停執行緒並釋放鎖
System.out.println("conditionA被喚醒");
conditionB.await();
System.out.println("conditionB被喚醒" );
System.out.println("我是執行緒1後面的程式碼");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.unlock();
}
};
Thread t2 = new Thread() {
@Override
public void run() {
lock.lock();
while (count < 10) {
count++;
System.out.println("執行緒2業務處理中: " + count);
try {
Thread.sleep(1000);
if (count == 5) {
conditionA.signal();
System.out.println("喚醒執行緒1");
lock.unlock();// 呼叫signal()方法後,執行緒2並不會釋放鎖,需要手動釋放執行緒2才會執行
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
lock.lock();// 不加這個會報java.lang.IllegalMonitorStateException
System.out.println("等待3秒後conditionB會被喚醒");
Thread.sleep(3000);
conditionB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();// 這裡釋放鎖,執行緒2執行完,執行緒1才會執行
}
};
t1.start();
t2.start();
}
}
// 執行緒1未達到業務要求,暫停中,等待執行緒2處理到達到要求後喚醒
// 執行緒2業務處理中: 1
// 執行緒2業務處理中: 2
// 執行緒2業務處理中: 3
// 執行緒2業務處理中: 4
// 執行緒2業務處理中: 5
// 喚醒執行緒1
// 執行緒2業務處理中: 6
// conditionA被喚醒
// 執行緒2業務處理中: 7
// 執行緒2業務處理中: 8
// 執行緒2業務處理中: 9
// 執行緒2業務處理中: 10
// 等待3秒後conditionB會被喚醒
// conditionB被喚醒
// 我是執行緒1後面的程式碼