使用
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 高并发程序升级》
本文深入探讨了Java并发编程中Condition接口的使用方法,包括其核心方法await()和signal(),以及如何与Lock接口配合使用。通过示例代码展示了Condition在实际线程控制中的应用,如线程等待和唤醒等。
1432

被折叠的 条评论
为什么被折叠?



