美文网首页
并发编程 - Condition

并发编程 - Condition

作者: 52HzBoo | 来源:发表于2018-09-03 13:59 被阅读0次

ReentrantLock的搭档:Condition

ReentrantLock通过Condition对自身进行增强
用于Lock控制线程执行顺序
代码如下:

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

/**
 * 模块:【Condition 和 重入锁组合应用】
 * <p>
 * 开发: Bruce.Liu By 2018/8/23 下午8:31 Create
 */
public class ReentrantLockCondition implements Runnable {

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

    @Override
    public void run() {
        try {
            lock.lock();
            System.err.println("Thread is going on await before");
            condition.await();//当前线程挂起-等待
            System.err.println("Thread is going on await after");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ReentrantLockCondition rlm = new ReentrantLockCondition();
        Thread t1 = new Thread(rlm);
        t1.start();
        TimeUnit.SECONDS.sleep(2);
        System.err.println("Main Lock Before");
        lock.lock();
        System.err.println("Main Lock After");
        condition.signal();//唤醒t1线程
        lock.unlock();//释放锁
        /**
         * 执行结果:
         *  1.Thread is going on await before
         *  2.Main Lock Before
         *  3.Main Lock After
         *  4.Thread is going on await after
         */
    }
}

代码解读

A. 上述代码中存在两个线程

  • main 函数启动的主线程
  • 主线线程创建的Thread t1 线程

B. main函数启动时会创建t1线程,为了让主线程等待t1执行使用了

TimeUnit.SECONDS.sleep(2);

C. t1线程加锁,输出打印执行到 condition.await();将当前t1线程线程挂起

System.err.println("Thread is going on await before");
condition.await();//当前线程挂起-等待

D. 主线程等待时间2s到期后,继续执行代码打印输出
直到condition.signal();//唤醒t1线程

 condition.signal();//唤醒t1线程

参考:《实战 Java 高并发程序设计》这本书。

相关文章

网友评论

      本文标题:并发编程 - Condition

      本文链接:https://www.haomeiwen.com/subject/yzbbwftx.html