Java Condition使用

使用
Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用

 void await() throws InterruptedException;
  调用前需要先获取锁,使当前线程等待,同时释放当前锁,当其他线程调用signal()方法或者signalAll()方法时,线程会重新获取锁并继续执行。
        或者线程被中断时,也能跳出等待。

 void awaitUninterruptibly();  //与await基本相同,但是它不能在等待过程中响应中断

 long awaitNanos(long var1) throws InterruptedException;   //线程等待,指定最长等待时间,单位ns

 boolean await(long var1, TimeUnit var3) throws InterruptedException;  //线程等待,指定最长等待时间

 boolean awaitUntil(Date var1) throws InterruptedException;  //线程等待,指定最长等待到某个时间

 void signal();   //用于唤醒一个等待中的线程

 void signalAll();  //唤醒所有等待中的线程

Demo

public class ConditionTest  implements Runnable{
  public static ReentrantLock lock = new ReentrantLock();
  public static Condition condition = lock.newCondition();



    @Override
    public void run() {
        try{
            lock.lock();
            System.out.println(Thread.currentThread().getName()  +",Thread is await,time:"+getCurrentDateTime());
            condition.await();  //线程等待直到其他线程唤醒
            System.out.println(Thread.currentThread().getName() + ",Thread is going on,time:"+ getCurrentDateTime());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    private String getCurrentDateTime() {
        DateFormat fdt = DateFormat.getDateTimeInstance();
        return fdt.format(new Date());
    }


    public static void main(String[] args) {
        ConditionTest cond = new ConditionTest();
        Thread thread1 = new Thread(cond,"Thread-t1");
        thread1.start();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        lock.lock();
        condition.signal();  //主线程唤醒一个正在等待的线程
        lock.unlock();
    }

}

结果:

Thread-t1,Thread is await,time:2020-5-15 18:14:14
Thread-t1,Thread is going on,time:2020-5-15 18:14:19

 

参考:《Java 高并发程序升级》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值