天天看點

lock的Condition 同步螢幕,順序調用例子

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();
        }
    }
}