< prev index next > src/java.base/share/classes/java/lang/Object.java
Print this page
* questions.
*/
package java.lang;
- import jdk.internal.misc.Blocker;
import jdk.internal.vm.annotation.IntrinsicCandidate;
/**
* Class {@code Object} is the root of the class hierarchy.
* Every class has {@code Object} as a superclass. All objects,
* @see #notifyAll()
* @see #wait()
* @see #wait(long, int)
*/
public final void wait(long timeoutMillis) throws InterruptedException {
- if (!Thread.currentThread().isVirtual()) {
- wait0(timeoutMillis);
- return;
+ if (timeoutMillis < 0) {
+ throw new IllegalArgumentException("timeout value is negative");
}
- // virtual thread waiting
- boolean attempted = Blocker.begin();
- try {
+ if (Thread.currentThread() instanceof VirtualThread vthread) {
+ try {
+ wait0(timeoutMillis);
+ } catch (InterruptedException e) {
+ // virtual thread's interrupt status needs to be cleared
+ vthread.getAndClearInterrupt();
+ throw e;
+ } finally {
+ if (timeoutMillis > 0) {
+ vthread.cancelWaitTimeout();
+ }
+ }
+ } else {
wait0(timeoutMillis);
- } catch (InterruptedException e) {
- // virtual thread's interrupt status needs to be cleared
- Thread.currentThread().getAndClearInterrupt();
- throw e;
- } finally {
- Blocker.end(attempted);
}
}
// final modifier so method not in vtable
private final native void wait0(long timeoutMillis) throws InterruptedException;
< prev index next >