Java线程学习之Condition条件

这篇文章从以下几个方面来介绍Condition:

  Condition是什么

  Condition有哪些方法

       Condition举个例子

1、Condition是什么?

  Condition是 java.util.concurrent.locks路径下的一个接口,Condition与重入锁搭配使用的,它的创建使用重入锁的 newCondition() 方法来完成。它是对重入锁的控制的一种条件补充,通过线程的等待和唤醒让线程控制更加地灵活,Condition接口的的await()和signal()方法就像Object.wait()和Object.notify()一样。

2、Condition有哪些方法?

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

    void awaitUninterruptibly();  //该方法与await()方法基本相同,但是它不会再等待过程中响应中断

    long awaitNanos(long nanosTimeout) throws InterruptedException;  //nanosTimeout是该方法等待信号的最大时间,如果一定时间内收到signal或者signalAll信号,那么就返回一个long类型的值,值为 nanosTimeout 减去  这段等待时间。如果等待过程中收到了中断异常,就会响应中断。如果直至nanosTimeout时间耗完仍未收到信号,则会返回0或者负数

    boolean await(long time, TimeUnit unit) throws InterruptedException; //等待一段时间,如果等待的时间内收到了signal或者signalAll就返回true,否则返回false。或者响应中断

    boolean awaitUntil(Date deadline) throws InterruptedException;  //等待一个时刻,如果返回时到达了最后期限就返回false否则就是true

    void signal();  //唤醒一个在await() 队列中的线程

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

Condition例子?

   await()和signal()方法

      

package com.example.demo.bingfa;

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

public class ReenterLockCondition 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("Thread is going on");

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ReenterLockCondition t1=new ReenterLockCondition();
        Thread thread=new Thread(t1);
        thread.start();
        Thread.sleep(2000);
        lock.lock();
        condition.signal();
        lock.unlock();
    }
}

以上的例子换一个图更好理解

    就是主线程先运行,然后创建运行子线程,子线程碰到了await方法进行等待,主线程休眠了两秒,两秒后,主线程发出了signal信号,await等待队列中断子线程被唤醒,然后子线程继续执行

posted on 2022-04-21 17:15  山水爱恋  阅读(453)  评论(0编辑  收藏  举报