1. 程式人生 > >java多執行緒學習之Condition,實現喚醒指定的部分執行緒

java多執行緒學習之Condition,實現喚醒指定的部分執行緒

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後面的程式碼