【線程基礎】Condition類的介紹與使用
簡單介紹一下Condition,Condition是Java1.5開始出現的,其出現的目的就是為了替代傳統的Object的wait()、notify()實現線程間的協作。相比傳統的方式使用Condition的await()、signal()這種方式實現線程間協作更加安全和高效。
常用方法介紹
| 方法名 | 作用 |
|---|---|
| void await() | 造成當前線程在接到信號或被中斷之前一直處于等待狀態。 |
| boolean await(long time, TimeUnit unit) | 造成當前線程在接到信號、被中斷或到達指定等待時間之前一直處于等待狀態是否超時,超時異常 |
| signal() | 喚醒一個等待線程。該線程從等待方法返回前必須獲得與Condition相關的鎖。 |
| signalAll() | 喚醒所有等待線程。能夠從等待方法返回的線程必須獲得與Condition相關的鎖。 |
| awaitUninterruptibly() | 造成當前線程在接到信號之前一直處于等待狀態。【注意:該方法對中斷不敏感】。 |
| awaitUntil(Date deadline) | 造成當前線程在接到信號、被中斷或到達指定最后期限之前一直處于等待狀態。如果沒有到指定時間就被通知,則返回true,否則表示到了指定時間,返回返回false。 |
| awaitNanos(long nanosTimeout) | 造成當前線程在接到信號、被中斷或到達指定等待時間之前一直處于等待狀態。返回值表示剩余時間,如果在nanosTimesout之前喚醒,那么返回值 = nanosTimeout - 消耗時間,如果返回值 <= 0 ,則可以認定它已經超時了。 |
示例代碼
public class LockConditionTest {
private static Lock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
Condition condition = lock.newCondition();
Thread thread0 = new Thread(()->{
lock.lock();
System.out.println(Thread.currentThread().getName()+"鎖上了");
try {
System.out.println(Thread.currentThread().getName()+"我要開始讓出鎖了...");
condition.await();
System.out.println(Thread.currentThread().getName()+"我又被喚醒了...");
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();
System.out.println(Thread.currentThread().getName()+"解鎖了");
});
Thread thread1 = new Thread(()->{
lock.lock();
System.out.println(Thread.currentThread().getName()+"鎖上了");
System.out.println("我要開始喚醒condition了");
condition.signal();
System.out.println("condition被我喚醒了");
lock.unlock();
System.out.println(Thread.currentThread().getName()+"解鎖了");
});
System.out.println("啟動等待線程");
thread0.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("啟動喚醒線程");
thread1.start();
}
}
輸出結果如下
啟動等待線程
Thread-0鎖上了
Thread-0我要開始讓出鎖了...
啟動喚醒線程
Thread-1鎖上了
我要開始喚醒condition了
condition被我喚醒了
Thread-1解鎖了
Thread-0我又被喚醒了...
Thread-0解鎖了
從上面的代碼和執行結果我們可以看到,其實Condition的await和signal就是線程中wait和notify的作用,并且他們也有一個相同的特性,就是必須加上鎖,也就是lock,加鎖的好處就是為了能讓線程可以按照自己制定的任務順序的邏輯來執行,這樣就保證了線程的安全性。

浙公網安備 33010602011771號