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等待队列中断子线程被唤醒,然后子线程继续执行