Condition:重入鎖的好搭檔

想必大家都知道,Objet類有wait() ,notify()方法;分別是讓線程等待和喚醒,那麼condition效果是大同小異的,只不過需要和ReentrantLock搭配使用(而wait和notify是和synchronzied搭配使用的)。由此可見,利用condition對象,我們就可以讓線程在合適的時間等待,或在特定的某個時間得到通知,繼續執行。

Condition接口有以下幾個方法:

void await() throws InterruptedException;
void awaitUninterruptibly();
long awaitNanos(long nanosTimeout) throws InterruptedException;
boolean await(long time, TimeUnit unit) throws InterruptedException;
boolean awaitUntil(Date deadline) throws InterruptedException;
void signal();
void signalAll();

其中await方法會使當前線程等待,同時釋放當前鎖,當其他線程中使用signal或者signalAll時,線程會重新獲得鎖並繼續執行,當線程被中斷時有嗯哪根跳出等待。

awaitUninterruptibly方法與await方法基本相同,但是不會在等待過程中響應中斷。

示例代碼:

package cn.yan.current;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class TestReenterLockCondition implements Runnable {

    public static ReentrantLock lock = new ReentrantLock();
    public static Condition condition = lock.newCondition();

    @Override
    public void run() {
        try {
            lock.lock();
            condition.await();
            System.out.println("線程繼續執行。。。");
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } finally {
            lock.unlock();
        }

    }


    public static void main(String[] args) throws InterruptedException {
        TestReenterLockCondition lockCondition = new TestReenterLockCondition();
        Thread thread1 = new Thread(lockCondition);

        thread1.start();
        System.out.println("線程開始。。。");
        Thread.sleep(2000);
        lock.lock();
        condition.signal();
        lock.unlock();
    }
}

其執行結果爲:

線程開始。。。
線程繼續執行。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章