《Java源码分析》:Condition

《Java源码分析》:Condition

如下这篇博文讲解的Condition真心将的好,自己结合了源码也基本上对Condition有了一个大致的了解。写篇博客记录下。

参考博客地址如下:http://ifeve.com/understand-condition/

API文档中对Condtion类列出的方法的说明如下

1、 void await()

造成当前线程在接到信号或被中断之前一直处于等待状态。

2、 boolean await(long time, TimeUnit unit)

造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。

3、long awaitNanos(long nanosTimeout)

造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。

4、 void awaitUninterruptibly()

造成当前线程在接到信号之前一直处于等待状态。

5、boolean awaitUntil(Date deadline)

造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。

6、 void signal() 唤醒一个等待线程。

7、 void signalAll() 唤醒所有等待线程。

下面以一个例子来开始介绍。

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

    public class ConditionDemo {
        private static Lock lock = new ReentrantLock();
        private static Condition condition = lock.newCondition();
        public static void main(String[] args) {
            Thread thread1 = new Thread(new Runnable(){

                @Override
                public void run() {
                    lock.lock();    
                    System.out.println(Thread.currentThread().getName()+"正在运行。。。。");
                    try {
                        Thread.sleep(2000);
                        System.out.println(Thread.currentThread().getName()+"停止运行,等待一个signal");
                        condition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"获得一个signal,继续执行");
                    lock.unlock();
                }

            },"waitThread");
            thread1.start();

            try {
                Thread.sleep(1000);//保证线程1先执行,否则线程1将一直等待signal信号
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            Thread thread2 = new Thread(new Runnable(){

                @Override
                public void run() {
                    lock.lock();    
                    System.out.println(Thread.currentThread().getName()+"正在运行。。。。");
                    condition.signal();//发送信号,唤醒其它线程
                    System.out.println(Thread.currentThread().getName()+"发送一个signal");
                    System.out.println(Thread.currentThread().getName()+"发送一个signal后,结束");
                    lock.unlock();
                }

            },"signalThread");
            thread2.start();

        }

    }

运行结果:

waitThread正在运行。。。。
waitThread停止运行,等待一个signal
signalThread正在运行。。。。
signalThread发送一个signal
signalThread发送一个signal后,结束
waitThread获得一个signal,继续执行

Condition的执行方式是这样的:

1、当Thread1拿到锁之后,开始执行,当调用condition.await()方法之后,thread1开始睡眠并释放锁

2、thread1开始睡眠并释放锁之后,thread2拿到锁,拿到锁之后开始运行,并调用condition.signal()发射一个信号来唤醒正在等待此条件condition的线程。发射信号之后thread2会继续执行,执行完毕后thread2释放锁。

3、当thread2释放锁之后,thread1拿到锁开始继续运行直至结束。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值