Lock
取代 synchronized
的使用方法和語句, Condition
取代了使用對象的監控方法。
Lock lock = new ReentrantLock();//公平鎖
Condition condition = lock.newCondition();
// condition.await(); //等待喚醒
// condition.signalAll();//喚醒全部
void signal()一個等待線程醒來。如果線程正在等待這種情況然後醒來的一個選擇。該線程從await回來之前必須重新獲得鎖。
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// condition.await(); //等待喚醒
// condition.signalAll();//喚醒全部
通用格式
public void increment() throws InterruptedException {
//加鎖
lock.lock();
try {
//通知其他線程
condition.signalAll();
} finally {
//關鎖
lock.unlock();
}
}
-------------------------------------------------
順序調用
public class C {
public static void main(String[] args) {
Date3 date = new Date3();
new Thread(()->{
for (int i = 0; i < 10; i++) {
date.printA();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
date.printB();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
date.printC();
}
},"C").start();
}
}
class Date3{//資源類 Lock
private Lock lock = new ReentrantLock();
//一個螢幕監視一個方法
Condition condition1 = lock.newCondition();
//一個螢幕監視一個方法
Condition condition2 = lock.newCondition();
//一個螢幕監視一個方法
Condition condition3 = lock.newCondition();
private int number = 1;
public void printA(){
lock.lock();
try {
//寫業務代碼
//業務->判斷->執行->通知
//如果number!=1就不僅進入方法,執行number=2,喚醒condition2
while (number!=1){
//等待
condition1.await();
}
System.out.println(Thread.currentThread().getName()+"->A");
number=2;
condition2.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printB(){
lock.lock();
try {
//寫業務代碼
//業務->判斷->執行->通知
//如果number!=2就不進入方法,執行number=3,喚醒condition3
while (number!=2){
condition2.await();
}
System.out.println(Thread.currentThread().getName()+"->B");
//喚醒指定的人
number=3;
condition3.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printC(){
lock.lock();
try {
//寫業務代碼
//業務->判斷->執行->通知
//如果number!=3就不進入方法,執行number=1,喚醒condition1
while (number!=3){
condition3.await();
}
System.out.println(Thread.currentThread().getName()+"->C");
number=1;
condition1.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}