1 /* 2 * Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.lang; 27 28 import java.lang.ref.Reference; 29 import java.lang.reflect.Field; 30 import java.time.Duration; 31 import java.util.Map; 32 import java.util.HashMap; 33 import java.util.Objects; 34 import java.util.concurrent.ThreadFactory; 35 import java.util.concurrent.StructureViolationException; 36 import java.util.concurrent.locks.LockSupport; 37 import jdk.internal.event.ThreadSleepEvent; 38 import jdk.internal.misc.TerminatingThreadLocal; 39 import jdk.internal.misc.Unsafe; 40 import jdk.internal.misc.VM; 41 import jdk.internal.vm.Continuation; 42 import jdk.internal.vm.ScopedValueContainer; 43 import jdk.internal.vm.StackableScope; 44 import jdk.internal.vm.ThreadContainer; 45 import jdk.internal.vm.annotation.ForceInline; 46 import jdk.internal.vm.annotation.Hidden; 47 import jdk.internal.vm.annotation.IntrinsicCandidate; 48 import jdk.internal.vm.annotation.Stable; 49 import sun.nio.ch.Interruptible; 50 import static java.util.concurrent.TimeUnit.MILLISECONDS; 51 import static java.util.concurrent.TimeUnit.NANOSECONDS; 52 53 /** 54 * A <i>thread</i> is a thread of execution in a program. The Java 55 * virtual machine allows an application to have multiple threads of 56 * execution running concurrently. 57 * 58 * <p> {@code Thread} defines constructors and a {@link Builder} to create threads. 59 * {@linkplain #start() Starting} a thread schedules it to execute its {@link #run() run} 60 * method. The newly started thread executes concurrently with the thread that caused 61 * it to start. 62 * 63 * <p> A thread <i>terminates</i> if either its {@code run} method completes normally, 64 * or if its {@code run} method completes abruptly and the appropriate {@linkplain 65 * Thread.UncaughtExceptionHandler uncaught exception handler} completes normally or 66 * abruptly. With no code left to run, the thread has completed execution. The 67 * {@link #join() join} method can be used to wait for a thread to terminate. 68 * 69 * <p> Threads have a unique {@linkplain #threadId() identifier} and a {@linkplain 70 * #getName() name}. The identifier is generated when a {@code Thread} is created 71 * and cannot be changed. The thread name can be specified when creating a thread 72 * or can be {@linkplain #setName(String) changed} at a later time. 73 * 74 * <p> Threads support {@link ThreadLocal} variables. These are variables that are 75 * local to a thread, meaning a thread can have a copy of a variable that is set to 76 * a value that is independent of the value set by other threads. {@code Thread} also 77 * supports {@link InheritableThreadLocal} variables that are thread local variables 78 * that are inherited at thread creation time from the parent {@code Thread}. 79 * {@code Thread} supports a special inheritable thread local for the thread 80 * {@linkplain #getContextClassLoader() context-class-loader}. 81 * 82 * <h2><a id="platform-threads">Platform threads</a></h2> 83 * <p> {@code Thread} supports the creation of <i>platform threads</i> that are 84 * typically mapped 1:1 to kernel threads scheduled by the operating system. 85 * Platform threads will usually have a large stack and other resources that are 86 * maintained by the operating system. Platforms threads are suitable for executing 87 * all types of tasks but may be a limited resource. 88 * 89 * <p> Platform threads get an automatically generated thread name by default. 90 * 91 * <p> Platform threads are designated <i>daemon</i> or <i>non-daemon</i> threads. 92 * When the Java virtual machine starts up, there is usually one non-daemon 93 * thread (the thread that typically calls the application's {@code main} method). 94 * The <a href="Runtime.html#shutdown">shutdown sequence</a> begins when all started 95 * non-daemon threads have terminated. Unstarted non-daemon threads do not prevent 96 * the shutdown sequence from beginning. 97 * 98 * <p> In addition to the daemon status, platform threads have a {@linkplain 99 * #getPriority() thread priority} and are members of a {@linkplain ThreadGroup 100 * thread group}. 101 * 102 * <h2><a id="virtual-threads">Virtual threads</a></h2> 103 * <p> {@code Thread} also supports the creation of <i>virtual threads</i>. 104 * Virtual threads are typically <i>user-mode threads</i> scheduled by the Java 105 * runtime rather than the operating system. Virtual threads will typically require 106 * few resources and a single Java virtual machine may support millions of virtual 107 * threads. Virtual threads are suitable for executing tasks that spend most of 108 * the time blocked, often waiting for I/O operations to complete. Virtual threads 109 * are not intended for long running CPU intensive operations. 110 * 111 * <p> Virtual threads typically employ a small set of platform threads used as 112 * <em>carrier threads</em>. Locking and I/O operations are examples of operations 113 * where a carrier thread may be re-scheduled from one virtual thread to another. 114 * Code executing in a virtual thread is not aware of the underlying carrier thread. 115 * The {@linkplain Thread#currentThread()} method, used to obtain a reference 116 * to the <i>current thread</i>, will always return the {@code Thread} object 117 * for the virtual thread. 118 * 119 * <p> Virtual threads do not have a thread name by default. The {@link #getName() 120 * getName} method returns the empty string if a thread name is not set. 121 * 122 * <p> Virtual threads are daemon threads and so do not prevent the 123 * <a href="Runtime.html#shutdown">shutdown sequence</a> from beginning. 124 * Virtual threads have a fixed {@linkplain #getPriority() thread priority} 125 * that cannot be changed. 126 * 127 * <h2>Creating and starting threads</h2> 128 * 129 * <p> {@code Thread} defines public constructors for creating platform threads and 130 * the {@link #start() start} method to schedule threads to execute. {@code Thread} 131 * may be extended for customization and other advanced reasons although most 132 * applications should have little need to do this. 133 * 134 * <p> {@code Thread} defines a {@link Builder} API for creating and starting both 135 * platform and virtual threads. The following are examples that use the builder: 136 * {@snippet : 137 * Runnable runnable = ... 138 * 139 * // Start a daemon thread to run a task 140 * Thread thread = Thread.ofPlatform().daemon().start(runnable); 141 * 142 * // Create an unstarted thread with name "duke", its start() method 143 * // must be invoked to schedule it to execute. 144 * Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable); 145 * 146 * // A ThreadFactory that creates daemon threads named "worker-0", "worker-1", ... 147 * ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory(); 148 * 149 * // Start a virtual thread to run a task 150 * Thread thread = Thread.ofVirtual().start(runnable); 151 * 152 * // A ThreadFactory that creates virtual threads 153 * ThreadFactory factory = Thread.ofVirtual().factory(); 154 * } 155 * 156 * <h2><a id="inheritance">Inheritance when creating threads</a></h2> 157 * A {@code Thread} created with one of the public constructors inherits the daemon 158 * status and thread priority from the parent thread at the time that the child {@code 159 * Thread} is created. The {@linkplain ThreadGroup thread group} is also inherited when 160 * not provided to the constructor. When using a {@code Thread.Builder} to create a 161 * platform thread, the daemon status, thread priority, and thread group are inherited 162 * when not set on the builder. As with the constructors, inheriting from the parent 163 * thread is done when the child {@code Thread} is created. 164 * 165 * <p> A {@code Thread} inherits its initial values of {@linkplain InheritableThreadLocal 166 * inheritable-thread-local} variables (including the context class loader) from 167 * the parent thread values at the time that the child {@code Thread} is created. 168 * The 5-param {@linkplain Thread#Thread(ThreadGroup, Runnable, String, long, boolean) 169 * constructor} can be used to create a thread that does not inherit its initial 170 * values from the constructing thread. When using a {@code Thread.Builder}, the 171 * {@link Builder#inheritInheritableThreadLocals(boolean) inheritInheritableThreadLocals} 172 * method can be used to select if the initial values are inherited. 173 * 174 * <p> Unless otherwise specified, passing a {@code null} argument to a constructor 175 * or method in this class will cause a {@link NullPointerException} to be thrown. 176 * 177 * @implNote 178 * In the JDK Reference Implementation, the virtual thread scheduler may be configured 179 * with the following system properties: 180 * <table class="striped"> 181 * <caption style="display:none">System properties</caption> 182 * <thead> 183 * <tr> 184 * <th scope="col">System property</th> 185 * <th scope="col">Description</th> 186 * </tr> 187 * </thead> 188 * <tbody> 189 * <tr> 190 * <th scope="row"> 191 * {@systemProperty jdk.virtualThreadScheduler.parallelism} 192 * </th> 193 * <td> The number of platform threads available for scheduling virtual 194 * threads. It defaults to the number of available processors. </td> 195 * </tr> 196 * <tr> 197 * <th scope="row"> 198 * {@systemProperty jdk.virtualThreadScheduler.maxPoolSize} 199 * </th> 200 * <td> The maximum number of platform threads available to the scheduler. 201 * It defaults to 256. </td> 202 * </tr> 203 * </tbody> 204 * </table> 205 * 206 * @since 1.0 207 */ 208 public class Thread implements Runnable { 209 /* Make sure registerNatives is the first thing <clinit> does. */ 210 private static native void registerNatives(); 211 static { 212 registerNatives(); 213 } 214 215 /* 216 * Reserved for exclusive use by the JVM. Cannot be moved to the FieldHolder 217 * as it needs to be set by the VM for JNI attaching threads, before executing 218 * the constructor that will create the FieldHolder. The historically named 219 * `eetop` holds the address of the underlying VM JavaThread, and is set to 220 * non-zero when the thread is started, and reset to zero when the thread terminates. 221 * A non-zero value indicates this thread isAlive(). 222 */ 223 private volatile long eetop; 224 225 // thread id 226 private final long tid; 227 228 // thread name 229 private volatile String name; 230 231 // interrupt status (read/written by VM) 232 volatile boolean interrupted; 233 234 // context ClassLoader 235 private volatile ClassLoader contextClassLoader; 236 237 // Additional fields for platform threads. 238 // All fields, except task, are accessed directly by the VM. 239 private static class FieldHolder { 240 final ThreadGroup group; 241 final Runnable task; 242 final long stackSize; 243 volatile int priority; 244 volatile boolean daemon; 245 volatile int threadStatus; 246 247 FieldHolder(ThreadGroup group, 248 Runnable task, 249 long stackSize, 250 int priority, 251 boolean daemon) { 252 this.group = group; 253 this.task = task; 254 this.stackSize = stackSize; 255 this.priority = priority; 256 if (daemon) 257 this.daemon = true; 258 } 259 } 260 private final FieldHolder holder; 261 262 /* 263 * ThreadLocal values pertaining to this thread. This map is maintained 264 * by the ThreadLocal class. 265 */ 266 ThreadLocal.ThreadLocalMap threadLocals; 267 268 /* 269 * InheritableThreadLocal values pertaining to this thread. This map is 270 * maintained by the InheritableThreadLocal class. 271 */ 272 ThreadLocal.ThreadLocalMap inheritableThreadLocals; 273 274 /* 275 * Scoped value bindings are maintained by the ScopedValue class. 276 */ 277 private Object scopedValueBindings; 278 279 // Special value to indicate this is a newly-created Thread 280 // Note that his must match the declaration in ScopedValue. 281 private static final Object NEW_THREAD_BINDINGS = Thread.class; 282 283 static Object scopedValueBindings() { 284 return currentThread().scopedValueBindings; 285 } 286 287 static void setScopedValueBindings(Object bindings) { 288 currentThread().scopedValueBindings = bindings; 289 } 290 291 /** 292 * Search the stack for the most recent scoped-value bindings. 293 */ 294 @IntrinsicCandidate 295 static native Object findScopedValueBindings(); 296 297 /** 298 * Inherit the scoped-value bindings from the given container. 299 * Invoked when starting a thread. 300 */ 301 void inheritScopedValueBindings(ThreadContainer container) { 302 ScopedValueContainer.BindingsSnapshot snapshot; 303 if (container.owner() != null 304 && (snapshot = container.scopedValueBindings()) != null) { 305 306 // bindings established for running/calling an operation 307 Object bindings = snapshot.scopedValueBindings(); 308 if (currentThread().scopedValueBindings != bindings) { 309 throw new StructureViolationException("Scoped value bindings have changed"); 310 } 311 312 this.scopedValueBindings = bindings; 313 } 314 } 315 316 /* 317 * Lock object for thread interrupt. 318 */ 319 final Object interruptLock = new Object(); 320 321 /** 322 * The argument supplied to the current call to 323 * java.util.concurrent.locks.LockSupport.park. 324 * Set by (private) java.util.concurrent.locks.LockSupport.setBlocker 325 * Accessed using java.util.concurrent.locks.LockSupport.getBlocker 326 */ 327 private volatile Object parkBlocker; 328 329 /* The object in which this thread is blocked in an interruptible I/O 330 * operation, if any. The blocker's interrupt method should be invoked 331 * after setting this thread's interrupt status. 332 */ 333 private Interruptible nioBlocker; 334 335 Interruptible nioBlocker() { 336 //assert Thread.holdsLock(interruptLock); 337 return nioBlocker; 338 } 339 340 /* Set the blocker field; invoked via jdk.internal.access.SharedSecrets 341 * from java.nio code 342 */ 343 void blockedOn(Interruptible b) { 344 //assert Thread.currentThread() == this; 345 synchronized (interruptLock) { 346 nioBlocker = b; 347 } 348 } 349 350 /** 351 * The minimum priority that a thread can have. 352 */ 353 public static final int MIN_PRIORITY = 1; 354 355 /** 356 * The default priority that is assigned to a thread. 357 */ 358 public static final int NORM_PRIORITY = 5; 359 360 /** 361 * The maximum priority that a thread can have. 362 */ 363 public static final int MAX_PRIORITY = 10; 364 365 /* 366 * Current inner-most continuation. 367 */ 368 private Continuation cont; 369 370 /** 371 * Returns the current continuation. 372 */ 373 Continuation getContinuation() { 374 return cont; 375 } 376 377 /** 378 * Sets the current continuation. 379 */ 380 void setContinuation(Continuation cont) { 381 this.cont = cont; 382 } 383 384 /** 385 * Returns the Thread object for the current platform thread. If the 386 * current thread is a virtual thread then this method returns the carrier. 387 */ 388 @IntrinsicCandidate 389 static native Thread currentCarrierThread(); 390 391 /** 392 * Returns the Thread object for the current thread. 393 * @return the current thread 394 */ 395 @IntrinsicCandidate 396 public static native Thread currentThread(); 397 398 /** 399 * Sets the Thread object to be returned by Thread.currentThread(). 400 */ 401 @IntrinsicCandidate 402 native void setCurrentThread(Thread thread); 403 404 // ScopedValue support: 405 406 @IntrinsicCandidate 407 static native Object[] scopedValueCache(); 408 409 @IntrinsicCandidate 410 static native void setScopedValueCache(Object[] cache); 411 412 @IntrinsicCandidate 413 static native void ensureMaterializedForStackWalk(Object o); 414 415 /** 416 * A hint to the scheduler that the current thread is willing to yield 417 * its current use of a processor. The scheduler is free to ignore this 418 * hint. 419 * 420 * <p> Yield is a heuristic attempt to improve relative progression 421 * between threads that would otherwise over-utilise a CPU. Its use 422 * should be combined with detailed profiling and benchmarking to 423 * ensure that it actually has the desired effect. 424 * 425 * <p> It is rarely appropriate to use this method. It may be useful 426 * for debugging or testing purposes, where it may help to reproduce 427 * bugs due to race conditions. It may also be useful when designing 428 * concurrency control constructs such as the ones in the 429 * {@link java.util.concurrent.locks} package. 430 */ 431 public static void yield() { 432 if (currentThread() instanceof VirtualThread vthread) { 433 vthread.tryYield(); 434 } else { 435 yield0(); 436 } 437 } 438 439 private static native void yield0(); 440 441 /** 442 * Called before sleeping to create a jdk.ThreadSleep event. 443 */ 444 private static ThreadSleepEvent beforeSleep(long nanos) { 445 try { 446 ThreadSleepEvent event = new ThreadSleepEvent(); 447 if (event.isEnabled()) { 448 event.time = nanos; 449 event.begin(); 450 return event; 451 } 452 } catch (OutOfMemoryError e) { 453 // ignore 454 } 455 return null; 456 } 457 458 459 /** 460 * Called after sleeping to commit the jdk.ThreadSleep event. 461 */ 462 private static void afterSleep(ThreadSleepEvent event) { 463 if (event != null) { 464 try { 465 event.commit(); 466 } catch (OutOfMemoryError e) { 467 // ignore 468 } 469 } 470 } 471 472 /** 473 * Sleep for the specified number of nanoseconds, subject to the precision 474 * and accuracy of system timers and schedulers. 475 */ 476 private static void sleepNanos(long nanos) throws InterruptedException { 477 ThreadSleepEvent event = beforeSleep(nanos); 478 try { 479 if (currentThread() instanceof VirtualThread vthread) { 480 vthread.sleepNanos(nanos); 481 } else { 482 sleepNanos0(nanos); 483 } 484 } finally { 485 afterSleep(event); 486 } 487 } 488 489 private static native void sleepNanos0(long nanos) throws InterruptedException; 490 491 /** 492 * Causes the currently executing thread to sleep (temporarily cease 493 * execution) for the specified number of milliseconds, subject to 494 * the precision and accuracy of system timers and schedulers. The thread 495 * does not lose ownership of any monitors. 496 * 497 * @param millis 498 * the length of time to sleep in milliseconds 499 * 500 * @throws IllegalArgumentException 501 * if the value of {@code millis} is negative 502 * 503 * @throws InterruptedException 504 * if any thread has interrupted the current thread. The 505 * <i>interrupted status</i> of the current thread is 506 * cleared when this exception is thrown. 507 */ 508 public static void sleep(long millis) throws InterruptedException { 509 if (millis < 0) { 510 throw new IllegalArgumentException("timeout value is negative"); 511 } 512 long nanos = MILLISECONDS.toNanos(millis); 513 sleepNanos(nanos); 514 } 515 516 /** 517 * Causes the currently executing thread to sleep (temporarily cease 518 * execution) for the specified number of milliseconds plus the specified 519 * number of nanoseconds, subject to the precision and accuracy of system 520 * timers and schedulers. The thread does not lose ownership of any 521 * monitors. 522 * 523 * @param millis 524 * the length of time to sleep in milliseconds 525 * 526 * @param nanos 527 * {@code 0-999999} additional nanoseconds to sleep 528 * 529 * @throws IllegalArgumentException 530 * if the value of {@code millis} is negative, or the value of 531 * {@code nanos} is not in the range {@code 0-999999} 532 * 533 * @throws InterruptedException 534 * if any thread has interrupted the current thread. The 535 * <i>interrupted status</i> of the current thread is 536 * cleared when this exception is thrown. 537 */ 538 public static void sleep(long millis, int nanos) throws InterruptedException { 539 if (millis < 0) { 540 throw new IllegalArgumentException("timeout value is negative"); 541 } 542 543 if (nanos < 0 || nanos > 999999) { 544 throw new IllegalArgumentException("nanosecond timeout value out of range"); 545 } 546 547 // total sleep time, in nanoseconds 548 long totalNanos = MILLISECONDS.toNanos(millis); 549 totalNanos += Math.min(Long.MAX_VALUE - totalNanos, nanos); 550 sleepNanos(totalNanos); 551 } 552 553 /** 554 * Causes the currently executing thread to sleep (temporarily cease 555 * execution) for the specified duration, subject to the precision and 556 * accuracy of system timers and schedulers. This method is a no-op if 557 * the duration is {@linkplain Duration#isNegative() negative}. 558 * 559 * @param duration 560 * the duration to sleep 561 * 562 * @throws InterruptedException 563 * if the current thread is interrupted while sleeping. The 564 * <i>interrupted status</i> of the current thread is 565 * cleared when this exception is thrown. 566 * 567 * @since 19 568 */ 569 public static void sleep(Duration duration) throws InterruptedException { 570 long nanos = NANOSECONDS.convert(duration); // MAX_VALUE if > 292 years 571 if (nanos < 0) { 572 return; 573 } 574 sleepNanos(nanos); 575 } 576 577 /** 578 * Indicates that the caller is momentarily unable to progress, until the 579 * occurrence of one or more actions on the part of other activities. By 580 * invoking this method within each iteration of a spin-wait loop construct, 581 * the calling thread indicates to the runtime that it is busy-waiting. 582 * The runtime may take action to improve the performance of invoking 583 * spin-wait loop constructions. 584 * 585 * @apiNote 586 * As an example consider a method in a class that spins in a loop until 587 * some flag is set outside of that method. A call to the {@code onSpinWait} 588 * method should be placed inside the spin loop. 589 * {@snippet : 590 * class EventHandler { 591 * volatile boolean eventNotificationNotReceived; 592 * void waitForEventAndHandleIt() { 593 * while ( eventNotificationNotReceived ) { 594 * Thread.onSpinWait(); 595 * } 596 * readAndProcessEvent(); 597 * } 598 * 599 * void readAndProcessEvent() { 600 * // Read event from some source and process it 601 * . . . 602 * } 603 * } 604 * } 605 * <p> 606 * The code above would remain correct even if the {@code onSpinWait} 607 * method was not called at all. However on some architectures the Java 608 * Virtual Machine may issue the processor instructions to address such 609 * code patterns in a more beneficial way. 610 * 611 * @since 9 612 */ 613 @IntrinsicCandidate 614 public static void onSpinWait() {} 615 616 /** 617 * Characteristic value signifying that initial values for {@link 618 * InheritableThreadLocal inheritable-thread-locals} are not inherited from 619 * the constructing thread. 620 * See Thread initialization. 621 */ 622 static final int NO_INHERIT_THREAD_LOCALS = 1 << 2; 623 624 /** 625 * Thread identifier assigned to the primordial thread. 626 */ 627 static final long PRIMORDIAL_TID = 3; 628 629 /** 630 * Helper class to generate thread identifiers. The identifiers start at 631 * {@link Thread#PRIMORDIAL_TID} +1 as this class cannot be used during 632 * early startup to generate the identifier for the primordial thread. The 633 * counter is off-heap and shared with the VM to allow it to assign thread 634 * identifiers to non-Java threads. 635 * See Thread initialization. 636 */ 637 private static class ThreadIdentifiers { 638 private static final Unsafe U; 639 private static final long NEXT_TID_OFFSET; 640 static { 641 U = Unsafe.getUnsafe(); 642 NEXT_TID_OFFSET = Thread.getNextThreadIdOffset(); 643 } 644 static long next() { 645 return U.getAndAddLong(null, NEXT_TID_OFFSET, 1); 646 } 647 } 648 649 /** 650 * Initializes a platform Thread. 651 * 652 * @param g the Thread group, can be null 653 * @param name the name of the new Thread 654 * @param characteristics thread characteristics 655 * @param task the object whose run() method gets called 656 * @param stackSize the desired stack size for the new thread, or 657 * zero to indicate that this parameter is to be ignored. 658 */ 659 Thread(ThreadGroup g, String name, int characteristics, Runnable task, long stackSize) { 660 661 Thread parent = currentThread(); 662 boolean attached = (parent == this); // primordial or JNI attached 663 664 if (attached) { 665 if (g == null) { 666 throw new InternalError("group cannot be null when attaching"); 667 } 668 this.holder = new FieldHolder(g, task, stackSize, NORM_PRIORITY, false); 669 } else { 670 if (g == null) { 671 // default to current thread's group 672 g = parent.getThreadGroup(); 673 } 674 int priority = Math.min(parent.getPriority(), g.getMaxPriority()); 675 this.holder = new FieldHolder(g, task, stackSize, priority, parent.isDaemon()); 676 } 677 678 if (attached && VM.initLevel() < 1) { 679 this.tid = PRIMORDIAL_TID; // primordial thread 680 } else { 681 this.tid = ThreadIdentifiers.next(); 682 } 683 684 this.name = (name != null) ? name : genThreadName(); 685 686 // thread locals 687 if (!attached) { 688 if ((characteristics & NO_INHERIT_THREAD_LOCALS) == 0) { 689 ThreadLocal.ThreadLocalMap parentMap = parent.inheritableThreadLocals; 690 if (parentMap != null && parentMap.size() > 0) { 691 this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parentMap); 692 } 693 if (VM.isBooted()) { 694 this.contextClassLoader = parent.getContextClassLoader(); 695 } 696 } else if (VM.isBooted()) { 697 // default CCL to the system class loader when not inheriting 698 this.contextClassLoader = ClassLoader.getSystemClassLoader(); 699 } 700 } 701 702 // special value to indicate this is a newly-created Thread 703 // Note that his must match the declaration in ScopedValue. 704 this.scopedValueBindings = NEW_THREAD_BINDINGS; 705 } 706 707 /** 708 * Initializes a virtual Thread. 709 * 710 * @param name thread name, can be null 711 * @param characteristics thread characteristics 712 * @param bound true when bound to an OS thread 713 */ 714 Thread(String name, int characteristics, boolean bound) { 715 this.tid = ThreadIdentifiers.next(); 716 this.name = (name != null) ? name : ""; 717 718 // thread locals 719 if ((characteristics & NO_INHERIT_THREAD_LOCALS) == 0) { 720 Thread parent = currentThread(); 721 ThreadLocal.ThreadLocalMap parentMap = parent.inheritableThreadLocals; 722 if (parentMap != null && parentMap.size() > 0) { 723 this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parentMap); 724 } 725 this.contextClassLoader = parent.getContextClassLoader(); 726 } else { 727 // default CCL to the system class loader when not inheriting 728 this.contextClassLoader = ClassLoader.getSystemClassLoader(); 729 } 730 731 // special value to indicate this is a newly-created Thread 732 this.scopedValueBindings = NEW_THREAD_BINDINGS; 733 734 // create a FieldHolder object, needed when bound to an OS thread 735 if (bound) { 736 ThreadGroup g = Constants.VTHREAD_GROUP; 737 int pri = NORM_PRIORITY; 738 this.holder = new FieldHolder(g, null, -1, pri, true); 739 } else { 740 this.holder = null; 741 } 742 } 743 744 /** 745 * Returns a builder for creating a platform {@code Thread} or {@code ThreadFactory} 746 * that creates platform threads. 747 * 748 * @apiNote The following are examples using the builder: 749 * {@snippet : 750 * // Start a daemon thread to run a task 751 * Thread thread = Thread.ofPlatform().daemon().start(runnable); 752 * 753 * // Create an unstarted thread with name "duke", its start() method 754 * // must be invoked to schedule it to execute. 755 * Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable); 756 * 757 * // A ThreadFactory that creates daemon threads named "worker-0", "worker-1", ... 758 * ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory(); 759 * } 760 * 761 * @return A builder for creating {@code Thread} or {@code ThreadFactory} objects. 762 * @since 21 763 */ 764 public static Builder.OfPlatform ofPlatform() { 765 return new ThreadBuilders.PlatformThreadBuilder(); 766 } 767 768 /** 769 * Returns a builder for creating a virtual {@code Thread} or {@code ThreadFactory} 770 * that creates virtual threads. 771 * 772 * @apiNote The following are examples using the builder: 773 * {@snippet : 774 * // Start a virtual thread to run a task. 775 * Thread thread = Thread.ofVirtual().start(runnable); 776 * 777 * // A ThreadFactory that creates virtual threads 778 * ThreadFactory factory = Thread.ofVirtual().factory(); 779 * } 780 * 781 * @return A builder for creating {@code Thread} or {@code ThreadFactory} objects. 782 * @since 21 783 */ 784 public static Builder.OfVirtual ofVirtual() { 785 return new ThreadBuilders.VirtualThreadBuilder(); 786 } 787 788 /** 789 * A builder for {@link Thread} and {@link ThreadFactory} objects. 790 * 791 * <p> {@code Builder} defines methods to set {@code Thread} properties such 792 * as the thread {@link #name(String) name}. This includes properties that would 793 * otherwise be <a href="Thread.html#inheritance">inherited</a>. Once set, a 794 * {@code Thread} or {@code ThreadFactory} is created with the following methods: 795 * 796 * <ul> 797 * <li> The {@linkplain #unstarted(Runnable) unstarted} method creates a new 798 * <em>unstarted</em> {@code Thread} to run a task. The {@code Thread}'s 799 * {@link Thread#start() start} method must be invoked to schedule the 800 * thread to execute. 801 * <li> The {@linkplain #start(Runnable) start} method creates a new {@code 802 * Thread} to run a task and schedules the thread to execute. 803 * <li> The {@linkplain #factory() factory} method creates a {@code ThreadFactory}. 804 * </ul> 805 * 806 * <p> A {@code Thread.Builder} is not thread safe. The {@code ThreadFactory} 807 * returned by the builder's {@code factory()} method is thread safe. 808 * 809 * <p> Unless otherwise specified, passing a null argument to a method in 810 * this interface causes a {@code NullPointerException} to be thrown. 811 * 812 * @see Thread#ofPlatform() 813 * @see Thread#ofVirtual() 814 * @since 21 815 */ 816 public sealed interface Builder 817 permits Builder.OfPlatform, Builder.OfVirtual { 818 819 /** 820 * Sets the thread name. 821 * @param name thread name 822 * @return this builder 823 */ 824 Builder name(String name); 825 826 /** 827 * Sets the thread name to be the concatenation of a string prefix and 828 * the string representation of a counter value. The counter's initial 829 * value is {@code start}. It is incremented after a {@code Thread} is 830 * created with this builder so that the next thread is named with 831 * the new counter value. A {@code ThreadFactory} created with this 832 * builder is seeded with the current value of the counter. The {@code 833 * ThreadFactory} increments its copy of the counter after {@link 834 * ThreadFactory#newThread(Runnable) newThread} is used to create a 835 * {@code Thread}. 836 * 837 * @apiNote 838 * The following example creates a builder that is invoked twice to start 839 * two threads named "{@code worker-0}" and "{@code worker-1}". 840 * {@snippet : 841 * Thread.Builder builder = Thread.ofPlatform().name("worker-", 0); 842 * Thread t1 = builder.start(task1); // name "worker-0" 843 * Thread t2 = builder.start(task2); // name "worker-1" 844 * } 845 * 846 * @param prefix thread name prefix 847 * @param start the starting value of the counter 848 * @return this builder 849 * @throws IllegalArgumentException if start is negative 850 */ 851 Builder name(String prefix, long start); 852 853 /** 854 * Sets whether the thread inherits the initial values of {@linkplain 855 * InheritableThreadLocal inheritable-thread-local} variables from the 856 * constructing thread. The default is to inherit. 857 * 858 * @param inherit {@code true} to inherit, {@code false} to not inherit 859 * @return this builder 860 */ 861 Builder inheritInheritableThreadLocals(boolean inherit); 862 863 /** 864 * Sets the uncaught exception handler. 865 * @param ueh uncaught exception handler 866 * @return this builder 867 */ 868 Builder uncaughtExceptionHandler(UncaughtExceptionHandler ueh); 869 870 /** 871 * Creates a new {@code Thread} from the current state of the builder to 872 * run the given task. The {@code Thread}'s {@link Thread#start() start} 873 * method must be invoked to schedule the thread to execute. 874 * 875 * @param task the object to run when the thread executes 876 * @return a new unstarted Thread 877 * 878 * @see <a href="Thread.html#inheritance">Inheritance when creating threads</a> 879 */ 880 Thread unstarted(Runnable task); 881 882 /** 883 * Creates a new {@code Thread} from the current state of the builder and 884 * schedules it to execute. 885 * 886 * @param task the object to run when the thread executes 887 * @return a new started Thread 888 * 889 * @see <a href="Thread.html#inheritance">Inheritance when creating threads</a> 890 */ 891 Thread start(Runnable task); 892 893 /** 894 * Returns a {@code ThreadFactory} to create threads from the current 895 * state of the builder. The returned thread factory is safe for use by 896 * multiple concurrent threads. 897 * 898 * @return a thread factory to create threads 899 */ 900 ThreadFactory factory(); 901 902 /** 903 * A builder for creating a platform {@link Thread} or {@link ThreadFactory} 904 * that creates platform threads. 905 * 906 * <p> Unless otherwise specified, passing a null argument to a method in 907 * this interface causes a {@code NullPointerException} to be thrown. 908 * 909 * @see Thread#ofPlatform() 910 * @since 21 911 */ 912 sealed interface OfPlatform extends Builder 913 permits ThreadBuilders.PlatformThreadBuilder { 914 915 @Override OfPlatform name(String name); 916 917 /** 918 * @throws IllegalArgumentException {@inheritDoc} 919 */ 920 @Override OfPlatform name(String prefix, long start); 921 922 @Override OfPlatform inheritInheritableThreadLocals(boolean inherit); 923 @Override OfPlatform uncaughtExceptionHandler(UncaughtExceptionHandler ueh); 924 925 /** 926 * Sets the thread group. 927 * @param group the thread group 928 * @return this builder 929 */ 930 OfPlatform group(ThreadGroup group); 931 932 /** 933 * Sets the daemon status. 934 * @param on {@code true} to create daemon threads 935 * @return this builder 936 */ 937 OfPlatform daemon(boolean on); 938 939 /** 940 * Sets the daemon status to {@code true}. 941 * @implSpec The default implementation invokes {@linkplain #daemon(boolean)} with 942 * a value of {@code true}. 943 * @return this builder 944 */ 945 default OfPlatform daemon() { 946 return daemon(true); 947 } 948 949 /** 950 * Sets the thread priority. 951 * @param priority priority 952 * @return this builder 953 * @throws IllegalArgumentException if the priority is less than 954 * {@link Thread#MIN_PRIORITY} or greater than {@link Thread#MAX_PRIORITY} 955 */ 956 OfPlatform priority(int priority); 957 958 /** 959 * Sets the desired stack size. 960 * 961 * <p> The stack size is the approximate number of bytes of address space 962 * that the Java virtual machine is to allocate for the thread's stack. The 963 * effect is highly platform dependent and the Java virtual machine is free 964 * to treat the {@code stackSize} parameter as a "suggestion". If the value 965 * is unreasonably low for the platform then a platform specific minimum 966 * may be used. If the value is unreasonably high then a platform specific 967 * maximum may be used. A value of zero is always ignored. 968 * 969 * @param stackSize the desired stack size 970 * @return this builder 971 * @throws IllegalArgumentException if the stack size is negative 972 */ 973 OfPlatform stackSize(long stackSize); 974 } 975 976 /** 977 * A builder for creating a virtual {@link Thread} or {@link ThreadFactory} 978 * that creates virtual threads. 979 * 980 * <p> Unless otherwise specified, passing a null argument to a method in 981 * this interface causes a {@code NullPointerException} to be thrown. 982 * 983 * @see Thread#ofVirtual() 984 * @since 21 985 */ 986 sealed interface OfVirtual extends Builder 987 permits ThreadBuilders.VirtualThreadBuilder { 988 989 @Override OfVirtual name(String name); 990 991 /** 992 * @throws IllegalArgumentException {@inheritDoc} 993 */ 994 @Override OfVirtual name(String prefix, long start); 995 996 @Override OfVirtual inheritInheritableThreadLocals(boolean inherit); 997 @Override OfVirtual uncaughtExceptionHandler(UncaughtExceptionHandler ueh); 998 } 999 } 1000 1001 /** 1002 * Throws CloneNotSupportedException as a Thread can not be meaningfully 1003 * cloned. Construct a new Thread instead. 1004 * 1005 * @throws CloneNotSupportedException 1006 * always 1007 */ 1008 @Override 1009 protected Object clone() throws CloneNotSupportedException { 1010 throw new CloneNotSupportedException(); 1011 } 1012 1013 /** 1014 * Helper class for auto-numbering platform threads. The numbers start at 1015 * 0 and are separate from the thread identifier for historical reasons. 1016 */ 1017 private static class ThreadNumbering { 1018 private static final Unsafe U; 1019 private static final Object NEXT_BASE; 1020 private static final long NEXT_OFFSET; 1021 static { 1022 U = Unsafe.getUnsafe(); 1023 try { 1024 Field nextField = ThreadNumbering.class.getDeclaredField("next"); 1025 NEXT_BASE = U.staticFieldBase(nextField); 1026 NEXT_OFFSET = U.staticFieldOffset(nextField); 1027 } catch (NoSuchFieldException e) { 1028 throw new ExceptionInInitializerError(e); 1029 } 1030 } 1031 private static volatile int next; 1032 static int next() { 1033 return U.getAndAddInt(NEXT_BASE, NEXT_OFFSET, 1); 1034 } 1035 } 1036 1037 /** 1038 * Generates a thread name of the form {@code Thread-<n>}. 1039 */ 1040 static String genThreadName() { 1041 return "Thread-" + ThreadNumbering.next(); 1042 } 1043 1044 /** 1045 * Throws NullPointerException if the name is null. Avoids use of 1046 * Objects.requireNonNull in early startup. 1047 */ 1048 private static String checkName(String name) { 1049 if (name == null) 1050 throw new NullPointerException("'name' is null"); 1051 return name; 1052 } 1053 1054 /** 1055 * Initializes a new platform {@code Thread}. This constructor has the same 1056 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 1057 * {@code (null, null, gname)}, where {@code gname} is a newly generated 1058 * name. Automatically generated names are of the form 1059 * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer. 1060 * 1061 * <p> This constructor is only useful when extending {@code Thread} to 1062 * override the {@link #run()} method. 1063 * 1064 * @see <a href="#inheritance">Inheritance when creating threads</a> 1065 */ 1066 public Thread() { 1067 this(null, null, 0, null, 0); 1068 } 1069 1070 /** 1071 * Initializes a new platform {@code Thread}. This constructor has the same 1072 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 1073 * {@code (null, task, gname)}, where {@code gname} is a newly generated 1074 * name. Automatically generated names are of the form 1075 * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer. 1076 * 1077 * <p> For a non-null task, invoking this constructor directly is equivalent to: 1078 * <pre>{@code Thread.ofPlatform().unstarted(task); }</pre> 1079 * 1080 * @param task 1081 * the object whose {@code run} method is invoked when this thread 1082 * is started. If {@code null}, this classes {@code run} method does 1083 * nothing. 1084 * 1085 * @see <a href="#inheritance">Inheritance when creating threads</a> 1086 */ 1087 public Thread(Runnable task) { 1088 this(null, null, 0, task, 0); 1089 } 1090 1091 /** 1092 * Initializes a new platform {@code Thread}. This constructor has the same 1093 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 1094 * {@code (group, task, gname)}, where {@code gname} is a newly generated 1095 * name. Automatically generated names are of the form 1096 * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer. 1097 * 1098 * <p> For a non-null group and task, invoking this constructor directly is 1099 * equivalent to: 1100 * <pre>{@code Thread.ofPlatform().group(group).unstarted(task); }</pre> 1101 * 1102 * @param group 1103 * the thread group. If {@code null} the group 1104 * is set to the current thread's thread group. 1105 * 1106 * @param task 1107 * the object whose {@code run} method is invoked when this thread 1108 * is started. If {@code null}, this thread's run method is invoked. 1109 * 1110 * @see <a href="#inheritance">Inheritance when creating threads</a> 1111 */ 1112 public Thread(ThreadGroup group, Runnable task) { 1113 this(group, null, 0, task, 0); 1114 } 1115 1116 /** 1117 * Initializes a new platform {@code Thread}. This constructor has the same 1118 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 1119 * {@code (null, null, name)}. 1120 * 1121 * <p> This constructor is only useful when extending {@code Thread} to 1122 * override the {@link #run()} method. 1123 * 1124 * @param name 1125 * the name of the new thread 1126 * 1127 * @see <a href="#inheritance">Inheritance when creating threads</a> 1128 */ 1129 public Thread(String name) { 1130 this(null, checkName(name), 0, null, 0); 1131 } 1132 1133 /** 1134 * Initializes a new platform {@code Thread}. This constructor has the same 1135 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 1136 * {@code (group, null, name)}. 1137 * 1138 * <p> This constructor is only useful when extending {@code Thread} to 1139 * override the {@link #run()} method. 1140 * 1141 * @param group 1142 * the thread group. If {@code null}, the group 1143 * is set to the current thread's thread group. 1144 * 1145 * @param name 1146 * the name of the new thread 1147 * 1148 * @see <a href="#inheritance">Inheritance when creating threads</a> 1149 */ 1150 public Thread(ThreadGroup group, String name) { 1151 this(group, checkName(name), 0, null, 0); 1152 } 1153 1154 /** 1155 * Initializes a new platform {@code Thread}. This constructor has the same 1156 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 1157 * {@code (null, task, name)}. 1158 * 1159 * <p> For a non-null task and name, invoking this constructor directly is 1160 * equivalent to: 1161 * <pre>{@code Thread.ofPlatform().name(name).unstarted(task); }</pre> 1162 * 1163 * @param task 1164 * the object whose {@code run} method is invoked when this thread 1165 * is started. If {@code null}, this thread's run method is invoked. 1166 * 1167 * @param name 1168 * the name of the new thread 1169 * 1170 * @see <a href="#inheritance">Inheritance when creating threads</a> 1171 */ 1172 public Thread(Runnable task, String name) { 1173 this(null, checkName(name), 0, task, 0); 1174 } 1175 1176 /** 1177 * Initializes a new platform {@code Thread} so that it has {@code task} 1178 * as its run object, has the specified {@code name} as its name, 1179 * and belongs to the thread group referred to by {@code group}. 1180 * 1181 * <p>The priority of the newly created thread is the smaller of 1182 * priority of the thread creating it and the maximum permitted 1183 * priority of the thread group. The method {@linkplain #setPriority 1184 * setPriority} may be used to change the priority to a new value. 1185 * 1186 * <p>The newly created thread is initially marked as being a daemon 1187 * thread if and only if the thread creating it is currently marked 1188 * as a daemon thread. The method {@linkplain #setDaemon setDaemon} 1189 * may be used to change whether or not a thread is a daemon. 1190 * 1191 * <p>For a non-null group, task, and name, invoking this constructor directly 1192 * is equivalent to: 1193 * <pre>{@code Thread.ofPlatform().group(group).name(name).unstarted(task); }</pre> 1194 * 1195 * @param group 1196 * the thread group. If {@code null}, the group 1197 * is set to the current thread's thread group. 1198 * 1199 * @param task 1200 * the object whose {@code run} method is invoked when this thread 1201 * is started. If {@code null}, this thread's run method is invoked. 1202 * 1203 * @param name 1204 * the name of the new thread 1205 * 1206 * @see <a href="#inheritance">Inheritance when creating threads</a> 1207 */ 1208 public Thread(ThreadGroup group, Runnable task, String name) { 1209 this(group, checkName(name), 0, task, 0); 1210 } 1211 1212 /** 1213 * Initializes a new platform {@code Thread} so that it has {@code task} 1214 * as its run object, has the specified {@code name} as its name, 1215 * and belongs to the thread group referred to by {@code group}, and has 1216 * the specified <i>stack size</i>. 1217 * 1218 * <p>This constructor is identical to {@link 1219 * #Thread(ThreadGroup,Runnable,String)} with the exception of the fact 1220 * that it allows the thread stack size to be specified. The stack size 1221 * is the approximate number of bytes of address space that the virtual 1222 * machine is to allocate for this thread's stack. <b>The effect of the 1223 * {@code stackSize} parameter, if any, is highly platform dependent.</b> 1224 * 1225 * <p>On some platforms, specifying a higher value for the 1226 * {@code stackSize} parameter may allow a thread to achieve greater 1227 * recursion depth before throwing a {@link StackOverflowError}. 1228 * Similarly, specifying a lower value may allow a greater number of 1229 * threads to exist concurrently without throwing an {@link 1230 * OutOfMemoryError} (or other internal error). The details of 1231 * the relationship between the value of the {@code stackSize} parameter 1232 * and the maximum recursion depth and concurrency level are 1233 * platform-dependent. <b>On some platforms, the value of the 1234 * {@code stackSize} parameter may have no effect whatsoever.</b> 1235 * 1236 * <p>The virtual machine is free to treat the {@code stackSize} 1237 * parameter as a suggestion. If the specified value is unreasonably low 1238 * for the platform, the virtual machine may instead use some 1239 * platform-specific minimum value; if the specified value is unreasonably 1240 * high, the virtual machine may instead use some platform-specific 1241 * maximum. Likewise, the virtual machine is free to round the specified 1242 * value up or down as it sees fit (or to ignore it completely). 1243 * 1244 * <p>Specifying a value of zero for the {@code stackSize} parameter will 1245 * cause this constructor to behave exactly like the 1246 * {@code Thread(ThreadGroup, Runnable, String)} constructor. 1247 * 1248 * <p><i>Due to the platform-dependent nature of the behavior of this 1249 * constructor, extreme care should be exercised in its use. 1250 * The thread stack size necessary to perform a given computation will 1251 * likely vary from one JRE implementation to another. In light of this 1252 * variation, careful tuning of the stack size parameter may be required, 1253 * and the tuning may need to be repeated for each JRE implementation on 1254 * which an application is to run.</i> 1255 * 1256 * <p>Implementation note: Java platform implementers are encouraged to 1257 * document their implementation's behavior with respect to the 1258 * {@code stackSize} parameter. 1259 * 1260 * <p>For a non-null group, task, and name, invoking this constructor directly 1261 * is equivalent to: 1262 * <pre>{@code Thread.ofPlatform().group(group).name(name).stackSize(stackSize).unstarted(task); }</pre> 1263 * 1264 * @param group 1265 * the thread group. If {@code null}, the group 1266 * is set to the current thread's thread group. 1267 * 1268 * @param task 1269 * the object whose {@code run} method is invoked when this thread 1270 * is started. If {@code null}, this thread's run method is invoked. 1271 * 1272 * @param name 1273 * the name of the new thread 1274 * 1275 * @param stackSize 1276 * the desired stack size for the new thread, or zero to indicate 1277 * that this parameter is to be ignored. 1278 * 1279 * @since 1.4 1280 * @see <a href="#inheritance">Inheritance when creating threads</a> 1281 */ 1282 public Thread(ThreadGroup group, Runnable task, String name, long stackSize) { 1283 this(group, checkName(name), 0, task, stackSize); 1284 } 1285 1286 /** 1287 * Initializes a new platform {@code Thread} so that it has {@code task} 1288 * as its run object, has the specified {@code name} as its name, 1289 * belongs to the thread group referred to by {@code group}, has 1290 * the specified {@code stackSize}, and inherits initial values for 1291 * {@linkplain InheritableThreadLocal inheritable thread-local} variables 1292 * if {@code inheritThreadLocals} is {@code true}. 1293 * 1294 * <p> This constructor is identical to {@link 1295 * #Thread(ThreadGroup,Runnable,String,long)} with the added ability to 1296 * suppress, or not, the inheriting of initial values for inheritable 1297 * thread-local variables from the constructing thread. This allows for 1298 * finer grain control over inheritable thread-locals. Care must be taken 1299 * when passing a value of {@code false} for {@code inheritThreadLocals}, 1300 * as it may lead to unexpected behavior if the new thread executes code 1301 * that expects a specific thread-local value to be inherited. 1302 * 1303 * <p> Specifying a value of {@code true} for the {@code inheritThreadLocals} 1304 * parameter will cause this constructor to behave exactly like the 1305 * {@code Thread(ThreadGroup, Runnable, String, long)} constructor. 1306 * 1307 * <p> For a non-null group, task, and name, invoking this constructor directly 1308 * is equivalent to: 1309 * <pre>{@code Thread.ofPlatform() 1310 * .group(group) 1311 * .name(name) 1312 * .stackSize(stackSize) 1313 * .inheritInheritableThreadLocals(inheritInheritableThreadLocals) 1314 * .unstarted(task); }</pre> 1315 * 1316 * @param group 1317 * the thread group. If {@code null}, the group 1318 * is set to the current thread's thread group. 1319 * 1320 * @param task 1321 * the object whose {@code run} method is invoked when this thread 1322 * is started. If {@code null}, this thread's run method is invoked. 1323 * 1324 * @param name 1325 * the name of the new thread 1326 * 1327 * @param stackSize 1328 * the desired stack size for the new thread, or zero to indicate 1329 * that this parameter is to be ignored 1330 * 1331 * @param inheritInheritableThreadLocals 1332 * if {@code true}, inherit initial values for inheritable 1333 * thread-locals from the constructing thread, otherwise no initial 1334 * values are inherited 1335 * 1336 * @since 9 1337 * @see <a href="#inheritance">Inheritance when creating threads</a> 1338 */ 1339 public Thread(ThreadGroup group, Runnable task, String name, 1340 long stackSize, boolean inheritInheritableThreadLocals) { 1341 this(group, checkName(name), 1342 (inheritInheritableThreadLocals ? 0 : NO_INHERIT_THREAD_LOCALS), 1343 task, stackSize); 1344 } 1345 1346 /** 1347 * Creates a virtual thread to execute a task and schedules it to execute. 1348 * 1349 * <p> This method is equivalent to: 1350 * <pre>{@code Thread.ofVirtual().start(task); }</pre> 1351 * 1352 * @param task the object to run when the thread executes 1353 * @return a new, and started, virtual thread 1354 * @see <a href="#inheritance">Inheritance when creating threads</a> 1355 * @since 21 1356 */ 1357 public static Thread startVirtualThread(Runnable task) { 1358 Objects.requireNonNull(task); 1359 var thread = ThreadBuilders.newVirtualThread(null, null, 0, task); 1360 thread.start(); 1361 return thread; 1362 } 1363 1364 /** 1365 * Returns {@code true} if this thread is a virtual thread. A virtual thread 1366 * is scheduled by the Java virtual machine rather than the operating system. 1367 * 1368 * @return {@code true} if this thread is a virtual thread 1369 * 1370 * @since 21 1371 */ 1372 public final boolean isVirtual() { 1373 return (this instanceof BaseVirtualThread); 1374 } 1375 1376 /** 1377 * Schedules this thread to begin execution. The thread will execute 1378 * independently of the current thread. 1379 * 1380 * <p> A thread can be started at most once. In particular, a thread can not 1381 * be restarted after it has terminated. 1382 * 1383 * @throws IllegalThreadStateException if the thread was already started 1384 */ 1385 public void start() { 1386 synchronized (this) { 1387 // zero status corresponds to state "NEW". 1388 if (holder.threadStatus != 0) 1389 throw new IllegalThreadStateException(); 1390 start0(); 1391 } 1392 } 1393 1394 /** 1395 * Schedules this thread to begin execution in the given thread container. 1396 * @throws IllegalStateException if the container is shutdown or closed 1397 * @throws IllegalThreadStateException if the thread has already been started 1398 */ 1399 void start(ThreadContainer container) { 1400 synchronized (this) { 1401 // zero status corresponds to state "NEW". 1402 if (holder.threadStatus != 0) 1403 throw new IllegalThreadStateException(); 1404 1405 // bind thread to container 1406 if (this.container != null) 1407 throw new IllegalThreadStateException(); 1408 setThreadContainer(container); 1409 1410 // start thread 1411 boolean started = false; 1412 container.onStart(this); // may throw 1413 try { 1414 // scoped values may be inherited 1415 inheritScopedValueBindings(container); 1416 1417 start0(); 1418 started = true; 1419 } finally { 1420 if (!started) { 1421 container.onExit(this); 1422 } 1423 } 1424 } 1425 } 1426 1427 private native void start0(); 1428 1429 /** 1430 * This method is run by the thread when it executes. Subclasses of {@code 1431 * Thread} may override this method. 1432 * 1433 * <p> This method is not intended to be invoked directly. If this thread is a 1434 * platform thread created with a {@link Runnable} task then invoking this method 1435 * will invoke the task's {@code run} method. If this thread is a virtual thread 1436 * then invoking this method directly does nothing. 1437 * 1438 * @implSpec The default implementation executes the {@link Runnable} task that 1439 * the {@code Thread} was created with. If the thread was created without a task 1440 * then this method does nothing. 1441 */ 1442 @Override 1443 public void run() { 1444 Runnable task = holder.task; 1445 if (task != null) { 1446 Object bindings = scopedValueBindings(); 1447 runWith(bindings, task); 1448 } 1449 } 1450 1451 /** 1452 * The VM recognizes this method as special, so any changes to the 1453 * name or signature require corresponding changes in 1454 * JVM_FindScopedValueBindings(). 1455 */ 1456 @Hidden 1457 @ForceInline 1458 final void runWith(Object bindings, Runnable op) { 1459 ensureMaterializedForStackWalk(bindings); 1460 op.run(); 1461 Reference.reachabilityFence(bindings); 1462 } 1463 1464 /** 1465 * Null out reference after Thread termination. 1466 */ 1467 void clearReferences() { 1468 threadLocals = null; 1469 inheritableThreadLocals = null; 1470 if (uncaughtExceptionHandler != null) 1471 uncaughtExceptionHandler = null; 1472 if (nioBlocker != null) 1473 nioBlocker = null; 1474 } 1475 1476 /** 1477 * This method is called by the VM to give a Thread 1478 * a chance to clean up before it actually exits. 1479 */ 1480 private void exit() { 1481 try { 1482 // pop any remaining scopes from the stack, this may block 1483 if (headStackableScopes != null) { 1484 StackableScope.popAll(); 1485 } 1486 } finally { 1487 // notify container that thread is exiting 1488 ThreadContainer container = threadContainer(); 1489 if (container != null) { 1490 container.onExit(this); 1491 } 1492 } 1493 1494 try { 1495 if (threadLocals != null && TerminatingThreadLocal.REGISTRY.isPresent()) { 1496 TerminatingThreadLocal.threadTerminated(); 1497 } 1498 } finally { 1499 clearReferences(); 1500 } 1501 } 1502 1503 /** 1504 * Throws {@code UnsupportedOperationException}. 1505 * 1506 * @throws UnsupportedOperationException always 1507 * 1508 * @deprecated This method was originally specified to "stop" a victim 1509 * thread by causing the victim thread to throw a {@link ThreadDeath}. 1510 * It was inherently unsafe. Stopping a thread caused it to unlock 1511 * all of the monitors that it had locked (as a natural consequence 1512 * of the {@code ThreadDeath} exception propagating up the stack). If 1513 * any of the objects previously protected by these monitors were in 1514 * an inconsistent state, the damaged objects became visible to 1515 * other threads, potentially resulting in arbitrary behavior. 1516 * Usages of {@code stop} should be replaced by code that simply 1517 * modifies some variable to indicate that the target thread should 1518 * stop running. The target thread should check this variable 1519 * regularly, and return from its run method in an orderly fashion 1520 * if the variable indicates that it is to stop running. If the 1521 * target thread waits for long periods (on a condition variable, 1522 * for example), the {@code interrupt} method should be used to 1523 * interrupt the wait. 1524 * For more information, see 1525 * <a href="{@docRoot}/java.base/java/lang/doc-files/threadPrimitiveDeprecation.html">Why 1526 * is Thread.stop deprecated and the ability to stop a thread removed?</a>. 1527 */ 1528 @Deprecated(since="1.2", forRemoval=true) 1529 public final void stop() { 1530 throw new UnsupportedOperationException(); 1531 } 1532 1533 /** 1534 * Interrupts this thread. 1535 * 1536 * <p> If this thread is blocked in an invocation of the {@link 1537 * Object#wait() wait()}, {@link Object#wait(long) wait(long)}, or {@link 1538 * Object#wait(long, int) wait(long, int)} methods of the {@link Object} 1539 * class, or of the {@link #join()}, {@link #join(long)}, {@link 1540 * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)} 1541 * methods of this class, then its interrupt status will be cleared and it 1542 * will receive an {@link InterruptedException}. 1543 * 1544 * <p> If this thread is blocked in an I/O operation upon an {@link 1545 * java.nio.channels.InterruptibleChannel InterruptibleChannel} 1546 * then the channel will be closed, the thread's interrupt 1547 * status will be set, and the thread will receive a {@link 1548 * java.nio.channels.ClosedByInterruptException}. 1549 * 1550 * <p> If this thread is blocked in a {@link java.nio.channels.Selector} 1551 * then the thread's interrupt status will be set and it will return 1552 * immediately from the selection operation, possibly with a non-zero 1553 * value, just as if the selector's {@link 1554 * java.nio.channels.Selector#wakeup wakeup} method were invoked. 1555 * 1556 * <p> If none of the previous conditions hold then this thread's interrupt 1557 * status will be set. </p> 1558 * 1559 * <p> Interrupting a thread that is not alive need not have any effect. 1560 * 1561 * @implNote In the JDK Reference Implementation, interruption of a thread 1562 * that is not alive still records that the interrupt request was made and 1563 * will report it via {@link #interrupted()} and {@link #isInterrupted()}. 1564 */ 1565 public void interrupt() { 1566 // Setting the interrupt status must be done before reading nioBlocker. 1567 interrupted = true; 1568 interrupt0(); // inform VM of interrupt 1569 1570 // thread may be blocked in an I/O operation 1571 if (this != Thread.currentThread()) { 1572 Interruptible blocker; 1573 synchronized (interruptLock) { 1574 blocker = nioBlocker; 1575 if (blocker != null) { 1576 blocker.interrupt(this); 1577 } 1578 } 1579 if (blocker != null) { 1580 blocker.postInterrupt(); 1581 } 1582 } 1583 } 1584 1585 /** 1586 * Tests whether the current thread has been interrupted. The 1587 * <i>interrupted status</i> of the thread is cleared by this method. In 1588 * other words, if this method were to be called twice in succession, the 1589 * second call would return false (unless the current thread were 1590 * interrupted again, after the first call had cleared its interrupted 1591 * status and before the second call had examined it). 1592 * 1593 * @return {@code true} if the current thread has been interrupted; 1594 * {@code false} otherwise. 1595 * @see #isInterrupted() 1596 */ 1597 public static boolean interrupted() { 1598 return currentThread().getAndClearInterrupt(); 1599 } 1600 1601 /** 1602 * Tests whether this thread has been interrupted. The <i>interrupted 1603 * status</i> of the thread is unaffected by this method. 1604 * 1605 * @return {@code true} if this thread has been interrupted; 1606 * {@code false} otherwise. 1607 * @see #interrupted() 1608 */ 1609 public boolean isInterrupted() { 1610 return interrupted; 1611 } 1612 1613 final void setInterrupt() { 1614 // assert Thread.currentCarrierThread() == this; 1615 if (!interrupted) { 1616 interrupted = true; 1617 interrupt0(); // inform VM of interrupt 1618 } 1619 } 1620 1621 final void clearInterrupt() { 1622 // assert Thread.currentCarrierThread() == this; 1623 if (interrupted) { 1624 interrupted = false; 1625 clearInterruptEvent(); 1626 } 1627 } 1628 1629 boolean getAndClearInterrupt() { 1630 boolean oldValue = interrupted; 1631 // We may have been interrupted the moment after we read the field, 1632 // so only clear the field if we saw that it was set and will return 1633 // true; otherwise we could lose an interrupt. 1634 if (oldValue) { 1635 interrupted = false; 1636 clearInterruptEvent(); 1637 } 1638 return oldValue; 1639 } 1640 1641 /** 1642 * Tests if this thread is alive. A thread is alive if it has 1643 * been started and has not yet terminated. 1644 * 1645 * @return {@code true} if this thread is alive; 1646 * {@code false} otherwise. 1647 */ 1648 public final boolean isAlive() { 1649 return alive(); 1650 } 1651 1652 /** 1653 * Returns true if this thread is alive. 1654 * This method is non-final so it can be overridden. 1655 */ 1656 boolean alive() { 1657 return eetop != 0; 1658 } 1659 1660 /** 1661 * Changes the priority of this thread. 1662 * 1663 * For platform threads, the priority is set to the smaller of the specified 1664 * {@code newPriority} and the maximum permitted priority of the thread's 1665 * {@linkplain ThreadGroup thread group}. 1666 * 1667 * The priority of a virtual thread is always {@link Thread#NORM_PRIORITY} 1668 * and {@code newPriority} is ignored. 1669 * 1670 * @param newPriority the new thread priority 1671 * @throws IllegalArgumentException if the priority is not in the 1672 * range {@code MIN_PRIORITY} to {@code MAX_PRIORITY}. 1673 * @see #setPriority(int) 1674 * @see ThreadGroup#getMaxPriority() 1675 */ 1676 public final void setPriority(int newPriority) { 1677 if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { 1678 throw new IllegalArgumentException(); 1679 } 1680 if (!isVirtual()) { 1681 priority(newPriority); 1682 } 1683 } 1684 1685 void priority(int newPriority) { 1686 ThreadGroup g = holder.group; 1687 if (g != null) { 1688 int maxPriority = g.getMaxPriority(); 1689 if (newPriority > maxPriority) { 1690 newPriority = maxPriority; 1691 } 1692 setPriority0(holder.priority = newPriority); 1693 } 1694 } 1695 1696 /** 1697 * Returns this thread's priority. 1698 * 1699 * <p> The priority of a virtual thread is always {@link Thread#NORM_PRIORITY}. 1700 * 1701 * @return this thread's priority. 1702 * @see #setPriority 1703 */ 1704 public final int getPriority() { 1705 if (isVirtual()) { 1706 return Thread.NORM_PRIORITY; 1707 } else { 1708 return holder.priority; 1709 } 1710 } 1711 1712 /** 1713 * Changes the name of this thread to be equal to the argument {@code name}. 1714 * 1715 * @implNote In the JDK Reference Implementation, if this thread is the 1716 * current thread, and it's a platform thread that was not attached to the 1717 * VM with the Java Native Interface 1718 * <a href="{@docRoot}/../specs/jni/invocation.html#attachcurrentthread"> 1719 * AttachCurrentThread</a> function, then this method will set the operating 1720 * system thread name. This may be useful for debugging and troubleshooting 1721 * purposes. 1722 * 1723 * @param name the new name for this thread. 1724 * 1725 * @spec jni/index.html Java Native Interface Specification 1726 * @see #getName 1727 */ 1728 public final synchronized void setName(String name) { 1729 if (name == null) { 1730 throw new NullPointerException("name cannot be null"); 1731 } 1732 this.name = name; 1733 if (!isVirtual() && Thread.currentThread() == this) { 1734 setNativeName(name); 1735 } 1736 } 1737 1738 /** 1739 * Returns this thread's name. 1740 * 1741 * @return this thread's name. 1742 * @see #setName(String) 1743 */ 1744 public final String getName() { 1745 return name; 1746 } 1747 1748 /** 1749 * Returns the thread's thread group or {@code null} if the thread has 1750 * terminated. 1751 * 1752 * <p> The thread group returned for a virtual thread is the special 1753 * <a href="ThreadGroup.html#virtualthreadgroup"><em>ThreadGroup for 1754 * virtual threads</em></a>. 1755 * 1756 * @return this thread's thread group or {@code null} 1757 */ 1758 public final ThreadGroup getThreadGroup() { 1759 if (isTerminated()) { 1760 return null; 1761 } else { 1762 return isVirtual() ? virtualThreadGroup() : holder.group; 1763 } 1764 } 1765 1766 /** 1767 * Returns an estimate of the number of {@linkplain #isAlive() live} 1768 * platform threads in the current thread's thread group and its subgroups. 1769 * Virtual threads are not included in the estimate. 1770 * 1771 * <p> The value returned is only an estimate because the number of 1772 * threads may change dynamically while this method traverses internal 1773 * data structures, and might be affected by the presence of certain 1774 * system threads. This method is intended primarily for debugging 1775 * and monitoring purposes. 1776 * 1777 * @return an estimate of the number of live platform threads in the 1778 * current thread's thread group and in any other thread group 1779 * that has the current thread's thread group as an ancestor 1780 */ 1781 public static int activeCount() { 1782 return currentThread().getThreadGroup().activeCount(); 1783 } 1784 1785 /** 1786 * Copies into the specified array every {@linkplain #isAlive() live} 1787 * platform thread in the current thread's thread group and its subgroups. 1788 * This method simply invokes the {@link java.lang.ThreadGroup#enumerate(Thread[])} 1789 * method of the current thread's thread group. Virtual threads are 1790 * not enumerated by this method. 1791 * 1792 * <p> An application might use the {@linkplain #activeCount activeCount} 1793 * method to get an estimate of how big the array should be, however 1794 * <i>if the array is too short to hold all the threads, the extra threads 1795 * are silently ignored.</i> If it is critical to obtain every live 1796 * thread in the current thread's thread group and its subgroups, the 1797 * invoker should verify that the returned int value is strictly less 1798 * than the length of {@code tarray}. 1799 * 1800 * <p> Due to the inherent race condition in this method, it is recommended 1801 * that the method only be used for debugging and monitoring purposes. 1802 * 1803 * @param tarray 1804 * an array into which to put the list of threads 1805 * 1806 * @return the number of threads put into the array 1807 */ 1808 public static int enumerate(Thread[] tarray) { 1809 return currentThread().getThreadGroup().enumerate(tarray); 1810 } 1811 1812 /** 1813 * Waits at most {@code millis} milliseconds for this thread to terminate. 1814 * A timeout of {@code 0} means to wait forever. 1815 * This method returns immediately, without waiting, if the thread has not 1816 * been {@link #start() started}. 1817 * 1818 * @implNote 1819 * For platform threads, the implementation uses a loop of {@code this.wait} 1820 * calls conditioned on {@code this.isAlive}. As a thread terminates the 1821 * {@code this.notifyAll} method is invoked. It is recommended that 1822 * applications not use {@code wait}, {@code notify}, or 1823 * {@code notifyAll} on {@code Thread} instances. 1824 * 1825 * @param millis 1826 * the time to wait in milliseconds 1827 * 1828 * @throws IllegalArgumentException 1829 * if the value of {@code millis} is negative 1830 * 1831 * @throws InterruptedException 1832 * if any thread has interrupted the current thread. The 1833 * <i>interrupted status</i> of the current thread is 1834 * cleared when this exception is thrown. 1835 */ 1836 public final void join(long millis) throws InterruptedException { 1837 if (millis < 0) 1838 throw new IllegalArgumentException("timeout value is negative"); 1839 1840 if (this instanceof VirtualThread vthread) { 1841 if (isAlive()) { 1842 long nanos = MILLISECONDS.toNanos(millis); 1843 vthread.joinNanos(nanos); 1844 } 1845 return; 1846 } 1847 1848 synchronized (this) { 1849 if (millis > 0) { 1850 if (isAlive()) { 1851 final long startTime = System.nanoTime(); 1852 long delay = millis; 1853 do { 1854 wait(delay); 1855 } while (isAlive() && (delay = millis - 1856 NANOSECONDS.toMillis(System.nanoTime() - startTime)) > 0); 1857 } 1858 } else { 1859 while (isAlive()) { 1860 wait(0); 1861 } 1862 } 1863 } 1864 } 1865 1866 /** 1867 * Waits at most {@code millis} milliseconds plus 1868 * {@code nanos} nanoseconds for this thread to terminate. 1869 * If both arguments are {@code 0}, it means to wait forever. 1870 * This method returns immediately, without waiting, if the thread has not 1871 * been {@link #start() started}. 1872 * 1873 * @implNote 1874 * For platform threads, the implementation uses a loop of {@code this.wait} 1875 * calls conditioned on {@code this.isAlive}. As a thread terminates the 1876 * {@code this.notifyAll} method is invoked. It is recommended that 1877 * applications not use {@code wait}, {@code notify}, or 1878 * {@code notifyAll} on {@code Thread} instances. 1879 * 1880 * @param millis 1881 * the time to wait in milliseconds 1882 * 1883 * @param nanos 1884 * {@code 0-999999} additional nanoseconds to wait 1885 * 1886 * @throws IllegalArgumentException 1887 * if the value of {@code millis} is negative, or the value 1888 * of {@code nanos} is not in the range {@code 0-999999} 1889 * 1890 * @throws InterruptedException 1891 * if any thread has interrupted the current thread. The 1892 * <i>interrupted status</i> of the current thread is 1893 * cleared when this exception is thrown. 1894 */ 1895 public final void join(long millis, int nanos) throws InterruptedException { 1896 if (millis < 0) { 1897 throw new IllegalArgumentException("timeout value is negative"); 1898 } 1899 1900 if (nanos < 0 || nanos > 999999) { 1901 throw new IllegalArgumentException("nanosecond timeout value out of range"); 1902 } 1903 1904 if (this instanceof VirtualThread vthread) { 1905 if (isAlive()) { 1906 // convert arguments to a total in nanoseconds 1907 long totalNanos = MILLISECONDS.toNanos(millis); 1908 totalNanos += Math.min(Long.MAX_VALUE - totalNanos, nanos); 1909 vthread.joinNanos(totalNanos); 1910 } 1911 return; 1912 } 1913 1914 if (nanos > 0 && millis < Long.MAX_VALUE) { 1915 millis++; 1916 } 1917 join(millis); 1918 } 1919 1920 /** 1921 * Waits for this thread to terminate. 1922 * 1923 * <p> An invocation of this method behaves in exactly the same 1924 * way as the invocation 1925 * 1926 * <blockquote> 1927 * {@linkplain #join(long) join}{@code (0)} 1928 * </blockquote> 1929 * 1930 * @throws InterruptedException 1931 * if any thread has interrupted the current thread. The 1932 * <i>interrupted status</i> of the current thread is 1933 * cleared when this exception is thrown. 1934 */ 1935 public final void join() throws InterruptedException { 1936 join(0); 1937 } 1938 1939 /** 1940 * Waits for this thread to terminate for up to the given waiting duration. 1941 * 1942 * <p> This method does not wait if the duration to wait is less than or 1943 * equal to zero. In this case, the method just tests if the thread has 1944 * terminated. 1945 * 1946 * @param duration 1947 * the maximum duration to wait 1948 * 1949 * @return {@code true} if the thread has terminated, {@code false} if the 1950 * thread has not terminated 1951 * 1952 * @throws InterruptedException 1953 * if the current thread is interrupted while waiting. 1954 * The <i>interrupted status</i> of the current thread is cleared 1955 * when this exception is thrown. 1956 * 1957 * @throws IllegalThreadStateException 1958 * if this thread has not been started. 1959 * 1960 * @since 19 1961 */ 1962 public final boolean join(Duration duration) throws InterruptedException { 1963 long nanos = NANOSECONDS.convert(duration); // MAX_VALUE if > 292 years 1964 1965 Thread.State state = threadState(); 1966 if (state == State.NEW) 1967 throw new IllegalThreadStateException("Thread not started"); 1968 if (state == State.TERMINATED) 1969 return true; 1970 if (nanos <= 0) 1971 return false; 1972 1973 if (this instanceof VirtualThread vthread) { 1974 return vthread.joinNanos(nanos); 1975 } 1976 1977 // convert to milliseconds 1978 long millis = MILLISECONDS.convert(nanos, NANOSECONDS); 1979 if (nanos > NANOSECONDS.convert(millis, MILLISECONDS)) { 1980 millis += 1L; 1981 } 1982 join(millis); 1983 return isTerminated(); 1984 } 1985 1986 /** 1987 * Prints a stack trace of the current thread to the standard error stream. 1988 * This method is useful for debugging. 1989 */ 1990 public static void dumpStack() { 1991 new Exception("Stack trace").printStackTrace(); 1992 } 1993 1994 /** 1995 * Marks this thread as either a <i>daemon</i> or <i>non-daemon</i> thread. 1996 * The <a href="Runtime.html#shutdown">shutdown sequence</a> begins when all 1997 * started non-daemon threads have terminated. 1998 * 1999 * <p> The daemon status of a virtual thread is always {@code true} and cannot be 2000 * changed by this method to {@code false}. 2001 * 2002 * <p> This method must be invoked before the thread is started. The behavior 2003 * of this method when the thread has terminated is not specified. 2004 * 2005 * @param on 2006 * if {@code true}, marks this thread as a daemon thread 2007 * 2008 * @throws IllegalArgumentException 2009 * if this is a virtual thread and {@code on} is false 2010 * @throws IllegalThreadStateException 2011 * if this thread is {@linkplain #isAlive alive} 2012 */ 2013 public final void setDaemon(boolean on) { 2014 if (isVirtual() && !on) 2015 throw new IllegalArgumentException("'false' not legal for virtual threads"); 2016 if (isAlive()) 2017 throw new IllegalThreadStateException(); 2018 if (!isVirtual()) 2019 daemon(on); 2020 } 2021 2022 void daemon(boolean on) { 2023 holder.daemon = on; 2024 } 2025 2026 /** 2027 * Tests if this thread is a daemon thread. 2028 * The daemon status of a virtual thread is always {@code true}. 2029 * 2030 * @return {@code true} if this thread is a daemon thread; 2031 * {@code false} otherwise. 2032 * @see #setDaemon(boolean) 2033 */ 2034 public final boolean isDaemon() { 2035 if (isVirtual()) { 2036 return true; 2037 } else { 2038 return holder.daemon; 2039 } 2040 } 2041 2042 /** 2043 * Does nothing. 2044 * 2045 * @deprecated This method originally determined if the currently running 2046 * thread had permission to modify this thread. This method was only useful 2047 * in conjunction with {@linkplain SecurityManager the Security Manager}, 2048 * which is no longer supported. There is no replacement for the Security 2049 * Manager or this method. 2050 */ 2051 @Deprecated(since="17", forRemoval=true) 2052 public final void checkAccess() { } 2053 2054 /** 2055 * Returns a string representation of this thread. The string representation 2056 * will usually include the thread's {@linkplain #threadId() identifier} and 2057 * name. The default implementation for platform threads includes the thread's 2058 * identifier, name, priority, and the name of the thread group. 2059 * 2060 * @return a string representation of this thread. 2061 */ 2062 public String toString() { 2063 StringBuilder sb = new StringBuilder("Thread[#"); 2064 sb.append(threadId()); 2065 sb.append(","); 2066 sb.append(getName()); 2067 sb.append(","); 2068 sb.append(getPriority()); 2069 sb.append(","); 2070 ThreadGroup group = getThreadGroup(); 2071 if (group != null) 2072 sb.append(group.getName()); 2073 sb.append("]"); 2074 return sb.toString(); 2075 } 2076 2077 /** 2078 * Returns the context {@code ClassLoader} for this thread. 2079 * The context {@code ClassLoader} may be set by the creator of the thread 2080 * for use by code running in this thread when loading classes and resources. 2081 * If not {@linkplain #setContextClassLoader set}, the default is to inherit 2082 * the context class loader from the parent thread. 2083 * 2084 * <p> The context {@code ClassLoader} of the primordial thread is typically 2085 * set to the class loader used to load the application. 2086 * 2087 * @return the context {@code ClassLoader} for this thread, or {@code null} 2088 * indicating the system class loader (or, failing that, the 2089 * bootstrap class loader) 2090 * 2091 * @since 1.2 2092 */ 2093 public ClassLoader getContextClassLoader() { 2094 return contextClassLoader; 2095 } 2096 2097 /** 2098 * Sets the context {@code ClassLoader} for this thread. 2099 * 2100 * <p> The context {@code ClassLoader} may be set by the creator of the thread 2101 * for use by code running in this thread when loading classes and resources. 2102 * 2103 * @param cl 2104 * the context ClassLoader for this Thread, or null indicating the 2105 * system class loader (or, failing that, the bootstrap class loader) 2106 * 2107 * @since 1.2 2108 */ 2109 public void setContextClassLoader(ClassLoader cl) { 2110 contextClassLoader = cl; 2111 } 2112 2113 /** 2114 * Returns {@code true} if and only if the current thread holds the 2115 * monitor lock on the specified object. 2116 * 2117 * <p>This method is designed to allow a program to assert that 2118 * the current thread already holds a specified lock: 2119 * <pre> 2120 * assert Thread.holdsLock(obj); 2121 * </pre> 2122 * 2123 * @param obj the object on which to test lock ownership 2124 * @return {@code true} if the current thread holds the monitor lock on 2125 * the specified object. 2126 * @since 1.4 2127 */ 2128 public static native boolean holdsLock(Object obj); 2129 2130 private static final StackTraceElement[] EMPTY_STACK_TRACE 2131 = new StackTraceElement[0]; 2132 2133 /** 2134 * Returns an array of stack trace elements representing the stack dump 2135 * of this thread. This method will return a zero-length array if 2136 * this thread has not started, has started but has not yet been 2137 * scheduled to run by the system, or has terminated. 2138 * If the returned array is of non-zero length then the first element of 2139 * the array represents the top of the stack, which is the most recent 2140 * method invocation in the sequence. The last element of the array 2141 * represents the bottom of the stack, which is the least recent method 2142 * invocation in the sequence. 2143 * 2144 * <p>Some virtual machines may, under some circumstances, omit one 2145 * or more stack frames from the stack trace. In the extreme case, 2146 * a virtual machine that has no stack trace information concerning 2147 * this thread is permitted to return a zero-length array from this 2148 * method. 2149 * 2150 * @return an array of {@code StackTraceElement}, 2151 * each represents one stack frame. 2152 * 2153 * @see Throwable#getStackTrace 2154 * @since 1.5 2155 */ 2156 public StackTraceElement[] getStackTrace() { 2157 if (this != Thread.currentThread()) { 2158 // optimization so we do not call into the vm for threads that 2159 // have not yet started or have terminated 2160 if (!isAlive()) { 2161 return EMPTY_STACK_TRACE; 2162 } 2163 StackTraceElement[] stackTrace = asyncGetStackTrace(); 2164 return (stackTrace != null) ? stackTrace : EMPTY_STACK_TRACE; 2165 } else { 2166 return (new Exception()).getStackTrace(); 2167 } 2168 } 2169 2170 /** 2171 * Returns an array of stack trace elements representing the stack dump of 2172 * this thread. Returns null if the stack trace cannot be obtained. In 2173 * the default implementation, null is returned if the thread is a virtual 2174 * thread that is not mounted or the thread is a platform thread that has 2175 * terminated. 2176 */ 2177 StackTraceElement[] asyncGetStackTrace() { 2178 Object stackTrace = getStackTrace0(); 2179 if (stackTrace == null) { 2180 return null; 2181 } 2182 StackTraceElement[] stes = (StackTraceElement[]) stackTrace; 2183 if (stes.length == 0) { 2184 return null; 2185 } else { 2186 return StackTraceElement.of(stes); 2187 } 2188 } 2189 2190 private native Object getStackTrace0(); 2191 2192 /** 2193 * Returns a map of stack traces for all live platform threads. The map 2194 * does not include virtual threads. 2195 * The map keys are threads and each map value is an array of 2196 * {@code StackTraceElement} that represents the stack dump 2197 * of the corresponding {@code Thread}. 2198 * The returned stack traces are in the format specified for 2199 * the {@link #getStackTrace getStackTrace} method. 2200 * 2201 * <p>The threads may be executing while this method is called. 2202 * The stack trace of each thread only represents a snapshot and 2203 * each stack trace may be obtained at different time. A zero-length 2204 * array will be returned in the map value if the virtual machine has 2205 * no stack trace information about a thread. 2206 * 2207 * @return a {@code Map} from {@code Thread} to an array of 2208 * {@code StackTraceElement} that represents the stack trace of 2209 * the corresponding thread. 2210 * 2211 * @see #getStackTrace 2212 * @see Throwable#getStackTrace 2213 * 2214 * @since 1.5 2215 */ 2216 public static Map<Thread, StackTraceElement[]> getAllStackTraces() { 2217 // Get a snapshot of the list of all threads 2218 Thread[] threads = getThreads(); 2219 StackTraceElement[][] traces = dumpThreads(threads); 2220 Map<Thread, StackTraceElement[]> m = HashMap.newHashMap(threads.length); 2221 for (int i = 0; i < threads.length; i++) { 2222 StackTraceElement[] stackTrace = traces[i]; 2223 if (stackTrace != null) { 2224 m.put(threads[i], stackTrace); 2225 } 2226 // else terminated so we don't put it in the map 2227 } 2228 return m; 2229 } 2230 2231 /** 2232 * Return an array of all live threads. 2233 */ 2234 static Thread[] getAllThreads() { 2235 return getThreads(); 2236 } 2237 2238 private static native StackTraceElement[][] dumpThreads(Thread[] threads); 2239 private static native Thread[] getThreads(); 2240 2241 /** 2242 * Returns the identifier of this Thread. The thread ID is a positive 2243 * {@code long} number generated when this thread was created. 2244 * The thread ID is unique and remains unchanged during its lifetime. 2245 * 2246 * @return this thread's ID 2247 * 2248 * @deprecated This method is not final and may be overridden to return a 2249 * value that is not the thread ID. Use {@link #threadId()} instead. 2250 * 2251 * @since 1.5 2252 */ 2253 @Deprecated(since="19") 2254 public long getId() { 2255 return threadId(); 2256 } 2257 2258 /** 2259 * Returns the identifier of this Thread. The thread ID is a positive 2260 * {@code long} number generated when this thread was created. 2261 * The thread ID is unique and remains unchanged during its lifetime. 2262 * 2263 * @return this thread's ID 2264 * @since 19 2265 */ 2266 public final long threadId() { 2267 return tid; 2268 } 2269 2270 /** 2271 * A thread state. A thread can be in one of the following states: 2272 * <ul> 2273 * <li>{@link #NEW}<br> 2274 * A thread that has not yet started is in this state. 2275 * </li> 2276 * <li>{@link #RUNNABLE}<br> 2277 * A thread executing in the Java virtual machine is in this state. 2278 * </li> 2279 * <li>{@link #BLOCKED}<br> 2280 * A thread that is blocked waiting for a monitor lock 2281 * is in this state. 2282 * </li> 2283 * <li>{@link #WAITING}<br> 2284 * A thread that is waiting indefinitely for another thread to 2285 * perform a particular action is in this state. 2286 * </li> 2287 * <li>{@link #TIMED_WAITING}<br> 2288 * A thread that is waiting for another thread to perform an action 2289 * for up to a specified waiting time is in this state. 2290 * </li> 2291 * <li>{@link #TERMINATED}<br> 2292 * A thread that has exited is in this state. 2293 * </li> 2294 * </ul> 2295 * 2296 * <p> 2297 * A thread can be in only one state at a given point in time. 2298 * These states are virtual machine states which do not reflect 2299 * any operating system thread states. 2300 * 2301 * @since 1.5 2302 * @see #getState 2303 */ 2304 public enum State { 2305 /** 2306 * Thread state for a thread which has not yet started. 2307 */ 2308 NEW, 2309 2310 /** 2311 * Thread state for a runnable thread. A thread in the runnable 2312 * state is executing in the Java virtual machine but it may 2313 * be waiting for other resources from the operating system 2314 * such as processor. 2315 */ 2316 RUNNABLE, 2317 2318 /** 2319 * Thread state for a thread blocked waiting for a monitor lock. 2320 * A thread in the blocked state is waiting for a monitor lock 2321 * to enter a synchronized block/method or 2322 * reenter a synchronized block/method after calling 2323 * {@link Object#wait() Object.wait}. 2324 */ 2325 BLOCKED, 2326 2327 /** 2328 * Thread state for a waiting thread. 2329 * A thread is in the waiting state due to calling one of the 2330 * following methods: 2331 * <ul> 2332 * <li>{@link Object#wait() Object.wait} with no timeout</li> 2333 * <li>{@link #join() Thread.join} with no timeout</li> 2334 * <li>{@link LockSupport#park() LockSupport.park}</li> 2335 * </ul> 2336 * 2337 * <p>A thread in the waiting state is waiting for another thread to 2338 * perform a particular action. 2339 * 2340 * For example, a thread that has called {@code Object.wait()} 2341 * on an object is waiting for another thread to call 2342 * {@code Object.notify()} or {@code Object.notifyAll()} on 2343 * that object. A thread that has called {@code Thread.join()} 2344 * is waiting for a specified thread to terminate. 2345 */ 2346 WAITING, 2347 2348 /** 2349 * Thread state for a waiting thread with a specified waiting time. 2350 * A thread is in the timed waiting state due to calling one of 2351 * the following methods with a specified positive waiting time: 2352 * <ul> 2353 * <li>{@link #sleep Thread.sleep}</li> 2354 * <li>{@link Object#wait(long) Object.wait} with timeout</li> 2355 * <li>{@link #join(long) Thread.join} with timeout</li> 2356 * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li> 2357 * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li> 2358 * </ul> 2359 */ 2360 TIMED_WAITING, 2361 2362 /** 2363 * Thread state for a terminated thread. 2364 * The thread has completed execution. 2365 */ 2366 TERMINATED; 2367 } 2368 2369 /** 2370 * Returns the state of this thread. 2371 * This method is designed for use in monitoring of the system state, 2372 * not for synchronization control. 2373 * 2374 * @return this thread's state. 2375 * @since 1.5 2376 */ 2377 public State getState() { 2378 return threadState(); 2379 } 2380 2381 /** 2382 * Returns the state of this thread. 2383 * This method can be used instead of getState as getState is not final and 2384 * so can be overridden to run arbitrary code. 2385 */ 2386 State threadState() { 2387 return jdk.internal.misc.VM.toThreadState(holder.threadStatus); 2388 } 2389 2390 /** 2391 * Returns true if the thread has terminated. 2392 */ 2393 boolean isTerminated() { 2394 return threadState() == State.TERMINATED; 2395 } 2396 2397 /** 2398 * Interface for handlers invoked when a {@code Thread} abruptly 2399 * terminates due to an uncaught exception. 2400 * <p>When a thread is about to terminate due to an uncaught exception 2401 * the Java Virtual Machine will query the thread for its 2402 * {@code UncaughtExceptionHandler} using 2403 * {@link #getUncaughtExceptionHandler} and will invoke the handler's 2404 * {@code uncaughtException} method, passing the thread and the 2405 * exception as arguments. 2406 * If a thread has not had its {@code UncaughtExceptionHandler} 2407 * explicitly set, then its {@code ThreadGroup} object acts as its 2408 * {@code UncaughtExceptionHandler}. If the {@code ThreadGroup} object 2409 * has no 2410 * special requirements for dealing with the exception, it can forward 2411 * the invocation to the {@linkplain #getDefaultUncaughtExceptionHandler 2412 * default uncaught exception handler}. 2413 * 2414 * @see #setDefaultUncaughtExceptionHandler 2415 * @see #setUncaughtExceptionHandler 2416 * @see ThreadGroup#uncaughtException 2417 * @since 1.5 2418 */ 2419 @FunctionalInterface 2420 public interface UncaughtExceptionHandler { 2421 /** 2422 * Method invoked when the given thread terminates due to the 2423 * given uncaught exception. 2424 * <p>Any exception thrown by this method will be ignored by the 2425 * Java Virtual Machine. 2426 * @param t the thread 2427 * @param e the exception 2428 */ 2429 void uncaughtException(Thread t, Throwable e); 2430 } 2431 2432 // null unless explicitly set 2433 private volatile UncaughtExceptionHandler uncaughtExceptionHandler; 2434 2435 // null unless explicitly set 2436 private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler; 2437 2438 /** 2439 * Set the default handler invoked when a thread abruptly terminates 2440 * due to an uncaught exception, and no other handler has been defined 2441 * for that thread. 2442 * 2443 * <p>Uncaught exception handling is controlled first by the thread, then 2444 * by the thread's {@link ThreadGroup} object and finally by the default 2445 * uncaught exception handler. If the thread does not have an explicit 2446 * uncaught exception handler set, and the thread's thread group 2447 * (including parent thread groups) does not specialize its 2448 * {@code uncaughtException} method, then the default handler's 2449 * {@code uncaughtException} method will be invoked. 2450 * <p>By setting the default uncaught exception handler, an application 2451 * can change the way in which uncaught exceptions are handled (such as 2452 * logging to a specific device, or file) for those threads that would 2453 * already accept whatever "default" behavior the system 2454 * provided. 2455 * 2456 * <p>Note that the default uncaught exception handler should not usually 2457 * defer to the thread's {@code ThreadGroup} object, as that could cause 2458 * infinite recursion. 2459 * 2460 * @param ueh the object to use as the default uncaught exception handler. 2461 * If {@code null} then there is no default handler. 2462 * 2463 * @see #setUncaughtExceptionHandler 2464 * @see #getUncaughtExceptionHandler 2465 * @see ThreadGroup#uncaughtException 2466 * @since 1.5 2467 */ 2468 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ueh) { 2469 defaultUncaughtExceptionHandler = ueh; 2470 } 2471 2472 /** 2473 * Returns the default handler invoked when a thread abruptly terminates 2474 * due to an uncaught exception. If the returned value is {@code null}, 2475 * there is no default. 2476 * @since 1.5 2477 * @see #setDefaultUncaughtExceptionHandler 2478 * @return the default uncaught exception handler for all threads 2479 */ 2480 public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler(){ 2481 return defaultUncaughtExceptionHandler; 2482 } 2483 2484 /** 2485 * Returns the handler invoked when this thread abruptly terminates 2486 * due to an uncaught exception. If this thread has not had an 2487 * uncaught exception handler explicitly set then this thread's 2488 * {@code ThreadGroup} object is returned, unless this thread 2489 * has terminated, in which case {@code null} is returned. 2490 * @since 1.5 2491 * @return the uncaught exception handler for this thread 2492 */ 2493 public UncaughtExceptionHandler getUncaughtExceptionHandler() { 2494 if (isTerminated()) { 2495 // uncaughtExceptionHandler may be set to null after thread terminates 2496 return null; 2497 } else { 2498 UncaughtExceptionHandler ueh = uncaughtExceptionHandler; 2499 return (ueh != null) ? ueh : getThreadGroup(); 2500 } 2501 } 2502 2503 /** 2504 * Set the handler invoked when this thread abruptly terminates 2505 * due to an uncaught exception. 2506 * <p>A thread can take full control of how it responds to uncaught 2507 * exceptions by having its uncaught exception handler explicitly set. 2508 * If no such handler is set then the thread's {@code ThreadGroup} 2509 * object acts as its handler. 2510 * @param ueh the object to use as this thread's uncaught exception 2511 * handler. If {@code null} then this thread has no explicit handler. 2512 * @see #setDefaultUncaughtExceptionHandler 2513 * @see ThreadGroup#uncaughtException 2514 * @since 1.5 2515 */ 2516 public void setUncaughtExceptionHandler(UncaughtExceptionHandler ueh) { 2517 uncaughtExceptionHandler(ueh); 2518 } 2519 2520 void uncaughtExceptionHandler(UncaughtExceptionHandler ueh) { 2521 uncaughtExceptionHandler = ueh; 2522 } 2523 2524 /** 2525 * Dispatch an uncaught exception to the handler. This method is 2526 * called when a thread terminates with an exception. 2527 */ 2528 void dispatchUncaughtException(Throwable e) { 2529 getUncaughtExceptionHandler().uncaughtException(this, e); 2530 } 2531 2532 /** 2533 * Holder class for constants. 2534 */ 2535 private static class Constants { 2536 // Thread group for virtual threads. 2537 static final ThreadGroup VTHREAD_GROUP; 2538 2539 static { 2540 ThreadGroup root = Thread.currentCarrierThread().getThreadGroup(); 2541 for (ThreadGroup p; (p = root.getParent()) != null; ) { 2542 root = p; 2543 } 2544 VTHREAD_GROUP = new ThreadGroup(root, "VirtualThreads", MAX_PRIORITY, false); 2545 } 2546 } 2547 2548 /** 2549 * Returns the special ThreadGroup for virtual threads. 2550 */ 2551 static ThreadGroup virtualThreadGroup() { 2552 return Constants.VTHREAD_GROUP; 2553 } 2554 2555 // The following three initially uninitialized fields are exclusively 2556 // managed by class java.util.concurrent.ThreadLocalRandom. These 2557 // fields are used to build the high-performance PRNGs in the 2558 // concurrent code. 2559 2560 /** The current seed for a ThreadLocalRandom */ 2561 long threadLocalRandomSeed; 2562 2563 /** Probe hash value; nonzero if threadLocalRandomSeed initialized */ 2564 int threadLocalRandomProbe; 2565 2566 /** Secondary seed isolated from public ThreadLocalRandom sequence */ 2567 int threadLocalRandomSecondarySeed; 2568 2569 /** The thread container that this thread is in */ 2570 private @Stable ThreadContainer container; 2571 ThreadContainer threadContainer() { 2572 return container; 2573 } 2574 void setThreadContainer(ThreadContainer container) { 2575 // assert this.container == null; 2576 this.container = container; 2577 } 2578 2579 /** The top of this stack of stackable scopes owned by this thread */ 2580 private volatile StackableScope headStackableScopes; 2581 StackableScope headStackableScopes() { 2582 return headStackableScopes; 2583 } 2584 static void setHeadStackableScope(StackableScope scope) { 2585 currentThread().headStackableScopes = scope; 2586 } 2587 2588 /* Some private helper methods */ 2589 private native void setPriority0(int newPriority); 2590 private native void interrupt0(); 2591 private static native void clearInterruptEvent(); 2592 private native void setNativeName(String name); 2593 2594 // The address of the next thread identifier, see ThreadIdentifiers. 2595 private static native long getNextThreadIdOffset(); 2596 }