//awaitNanos方法是用于在给定毫秒值内沉睡,超出时间或者被唤醒则醒过来。
//和await大部分方法一样,只是在内部多维护了一个毫秒值的时间。
public final long awaitNanos(long nanosTimeout)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
Node node = addConditionWaiter();
int savedState = fullyRelease(node);
long lastTime = System.nanoTime();
int interruptMode = 0;
while (!isOnSyncQueue(node)) {
//如果等待时间<0
if (nanosTimeout <= 0L) {
//加入sync队列
transferAfterCancelledWait(node);
break;
}
LockSupport.parkNanos(this, nanosTimeout);
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
long now = System.nanoTime();
nanosTimeout -= now - lastTime;
lastTime = now;
}
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (node.nextWaiter != null)
unlinkCancelledWaiters();
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
return nanosTimeout - (System.nanoTime() - lastTime);
}
//在到达传入的时间前或者接到唤醒信号前阻塞线程。
public final boolean awaitUntil(Date deadline)
throws InterruptedException {
if (deadline == null)
throw new NullPointerException();
long abstime = deadline.getTime();
if (Thread.interrupted())
throw new InterruptedException();
Node node = addConditionWaiter();
int savedState = fullyRelease(node);
boolean timedout = false;
int interruptMode = 0;
while (!isOnSyncQueue(node)) {
//时间大于沉睡时间就移入队列等待唤醒
if (System.currentTimeMillis() > abstime) {
timedout = transferAfterCancelledWait(node);
break;
}
//沉睡一直到abstime
LockSupport.parkUntil(this, abstime);
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
}
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (node.nextWaiter != null)
unlinkCancelledWaiters();
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
return !timedout;
}
//这个方法和awaitNanos基本一样。
public final boolean await(long time, TimeUnit unit)
throws InterruptedException {
if (unit == null)
throw new NullPointerException();
long nanosTimeout = unit.toNanos(time);
if (Thread.interrupted())
throw new InterruptedException();
Node node = addConditionWaiter();
int savedState = fullyRelease(node);
long lastTime = System.nanoTime();
boolean timedout = false;
int interruptMode = 0;
while (!isOnSyncQueue(node)) {
if (nanosTimeout <= 0L) {
timedout = transferAfterCancelledWait(node);
break;
}
if (nanosTimeout >= spinForTimeoutThreshold)
LockSupport.parkNanos(this, nanosTimeout);
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
long now = System.nanoTime();
nanosTimeout -= now - lastTime;
lastTime = now;
}
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (node.nextWaiter != null)
unlinkCancelledWaiters();
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
return !timedout;
}
//增加了该线程对于中断的响应。
public final void awaitUninterruptibly() {
Node node = addConditionWaiter();
int savedState = fullyRelease(node);
boolean interrupted = false;
while (!isOnSyncQueue(node)) {
LockSupport.park(this);
if (Thread.interrupted())
interrupted = true;
}
if (acquireQueued(node, savedState) || interrupted)
selfInterrupt();
}
//这个方法为将所有condition队列上的线程放入到sync队列中
public final void signalAll() {
if (!isHeldExclusively())
throw new IllegalMonitorStateException();
Node first = firstWaiter;
if (first != null)
doSignalAll(first);
}
private void doSignalAll(Node first) {
lastWaiter = firstWaiter = null;
do {
Node next = first.nextWaiter;
first.nextWaiter = null;
transferForSignal(first);
first = next;
} while (first != null);
}
final boolean transferForSignal(Node node) {
/*
* If cannot change waitStatus, the node has been cancelled.
*/
if (!compareAndSetWaitStatus(node, Node.CONDITION, 0))
return false;
/*
* Splice onto queue and try to set waitStatus of predecessor to
* indicate that thread is (probably) waiting. If cancelled or
* attempt to set waitStatus fails, wake up to resync (in which
* case the waitStatus can be transiently and harmlessly wrong).
*/
Node p = enq(node);
int ws = p.waitStatus;
if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL))
LockSupport.unpark(node.thread);
return true;
}
分享到:
相关推荐
与`synchronized`的`wait()`和`notifyAll()`不同,`Condition`提供了`await()`和`signal()`方法,可以精确地唤醒一个或多个等待的线程。 - **可中断锁等待**:与`synchronized`不同,`ReentrantLock`的`...
在Java并发编程中,`Condition`接口是Java并发包(java.util.concurrent)中的一个重要组成部分,它提供了比`synchronized`关键字更为精细的线程同步和唤醒机制。`Condition`允许我们创建多个独立的等待队列,每个...
Java Lock与Condition是Java并发编程中的重要概念,它们提供了比synchronized关键字更细粒度的控制,从而使得多线程程序的设计和管理更加灵活高效。本文将深入探讨ReentrantLock(可重入锁)和Condition的基本原理、...
Java异步调用转同步方法实例详解 Java异步调用转同步方法实例详解是指在Java中将异步调用转换为同步调用的技术,主要用于解决异步调用过程中的阻塞问题。异步调用是一种非阻塞的调用方式,调用方在调用过程中,不...
2. 等待操作:使用 Condition 的 await() 方法可以让当前线程等待,直到其他线程调用该 Condition 的 signal() 方法或 signalAll() 方法来唤醒该线程。await() 方法有多个变体,例如 awaitNanos(long nanosTimeout)...
Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...
本文将详细介绍Condition接口的工作原理、使用方法以及如何在实际项目中应用它。 Condition接口是Java并发编程中实现等待/通知模式的重要工具。它提供了灵活的等待/通知机制,允许线程在特定条件不满足时挂起,并在...
- `void await() throws InterruptedException`: 当前线程在调用此方法后会被放入等待队列,直到其他线程调用对应的`signal()`或`signalAll()`方法,或者当前线程被中断,才会返回。如果线程在等待期间被中断,会抛...
Java并发编程之Condition源码分析 Condition是Java并发编程中的一种同步机制,用于实现异步通信的同步。Condition主要有两个方法:await()和signal()。await()方法可以阻塞当前线程,并释放锁,而signal()方法可以...
Condition接口是Java并发包java.util.concurrent.locks的一部分,它允许我们创建特定于锁的等待集合。相比于Object的监视器方法,Condition提供了更大的灵活性,可以为每个Lock创建多个Condition实例,从而更好地...
然而,`Nashorn`引擎在Java 11中已被弃用,因此在更现代的Java版本中,你可能需要寻找其他解决方案,如使用`GraalVM`的JavaScript引擎。 另外,如果我们要实现类似`eval`的字符串计算功能,但不涉及完整的...
Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...
在Java编程语言中,类方法的控制结构是构建程序逻辑的关键元素。这些结构决定了代码的执行顺序,使得程序能够根据不同的条件和循环条件执行特定的操作。以下是对标题和描述中涉及知识点的详细说明: 1. **顺序结构*...
下面我们将详细介绍`Condition`类的使用方法,并通过示例代码来展示其功能。 首先,`Condition`类是`com.baomidou.mybatisplus.core.conditions`包下的核心类,它主要用于构建复杂的查询条件。在实际开发中,我们...
Java 连接数据库的方法主要涉及Java Database Connectivity (JDBC),它是Java编程语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如连接数据库、发送SQL语句、处理结果集等功能。JDBC是J2SE的一...
在Java编程语言中,算数方法是用于执行基本数学运算的核心组成部分。这些方法包括加法、减法、乘法、除法...在实际编程中,这些方法常常与其他语言结构(如条件语句、循环和数组)结合使用,以解决更复杂的计算问题。
Java并发之条件阻塞Condition是Java并发编程中的一种高级同步机制,它允许线程在某个条件下等待或唤醒其他线程。Condition将Object监视器方法(wait、notify和notifyAll)分解成截然不同的对象,以便通过将这些对象...
在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在处理性能敏感的任务,如图形渲染、硬件访问或者与C/C++库集成时,尤其有用。本话题将深入探讨如何...
根据给定的文件内容,我们可以总结出以下几个重要的Java知识点: ### 1.... 接口可以继承其他接口,但接口中的方法默认是抽象的,不能有方法体。 - D. 接口中不能有方法体。 因此,正确答案是D。