Thread.java revision 13194:ff9ac07019d6
10Sduke/* 211884Sykantser * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. 30Sduke * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 40Sduke * 50Sduke * This code is free software; you can redistribute it and/or modify it 60Sduke * under the terms of the GNU General Public License version 2 only, as 70Sduke * published by the Free Software Foundation. Oracle designates this 80Sduke * particular file as subject to the "Classpath" exception as provided 90Sduke * by Oracle in the LICENSE file that accompanied this code. 100Sduke * 110Sduke * This code is distributed in the hope that it will be useful, but WITHOUT 120Sduke * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 130Sduke * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 140Sduke * version 2 for more details (a copy is included in the LICENSE file that 150Sduke * accompanied this code). 160Sduke * 170Sduke * You should have received a copy of the GNU General Public License version 180Sduke * 2 along with this work; if not, write to the Free Software Foundation, 192362Sohair * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 202362Sohair * 212362Sohair * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 220Sduke * or visit www.oracle.com if you need additional information or have any 230Sduke * questions. 240Sduke */ 250Sduke 260Sdukepackage java.lang; 270Sduke 280Sdukeimport java.lang.ref.Reference; 290Sdukeimport java.lang.ref.ReferenceQueue; 300Sdukeimport java.lang.ref.WeakReference; 3116958Siignatyevimport java.security.AccessController; 320Sdukeimport java.security.AccessControlContext; 330Sdukeimport java.security.PrivilegedAction; 3412287Sakulyakhimport java.util.Map; 350Sdukeimport java.util.HashMap; 360Sdukeimport java.util.concurrent.ConcurrentHashMap; 370Sdukeimport java.util.concurrent.ConcurrentMap; 380Sdukeimport java.util.concurrent.locks.LockSupport; 390Sdukeimport sun.nio.ch.Interruptible; 400Sdukeimport sun.reflect.CallerSensitive; 410Sdukeimport sun.reflect.Reflection; 420Sdukeimport sun.security.util.SecurityConstants; 430Sdukeimport jdk.internal.HotSpotIntrinsicCandidate; 440Sduke 450Sduke/** 460Sduke * A <i>thread</i> is a thread of execution in a program. The Java 470Sduke * Virtual Machine allows an application to have multiple threads of 480Sduke * execution running concurrently. 490Sduke * <p> 500Sduke * Every thread has a priority. Threads with higher priority are 510Sduke * executed in preference to threads with lower priority. Each thread 520Sduke * may or may not also be marked as a daemon. When code running in 530Sduke * some thread creates a new <code>Thread</code> object, the new 540Sduke * thread has its priority initially set equal to the priority of the 550Sduke * creating thread, and is a daemon thread if and only if the 560Sduke * creating thread is a daemon. 570Sduke * <p> 580Sduke * When a Java Virtual Machine starts up, there is usually a single 590Sduke * non-daemon thread (which typically calls the method named 600Sduke * <code>main</code> of some designated class). The Java Virtual 610Sduke * Machine continues to execute threads until either of the following 620Sduke * occurs: 630Sduke * <ul> 640Sduke * <li>The <code>exit</code> method of class <code>Runtime</code> has been 65 * called and the security manager has permitted the exit operation 66 * to take place. 67 * <li>All threads that are not daemon threads have died, either by 68 * returning from the call to the <code>run</code> method or by 69 * throwing an exception that propagates beyond the <code>run</code> 70 * method. 71 * </ul> 72 * <p> 73 * There are two ways to create a new thread of execution. One is to 74 * declare a class to be a subclass of <code>Thread</code>. This 75 * subclass should override the <code>run</code> method of class 76 * <code>Thread</code>. An instance of the subclass can then be 77 * allocated and started. For example, a thread that computes primes 78 * larger than a stated value could be written as follows: 79 * <hr><blockquote><pre> 80 * class PrimeThread extends Thread { 81 * long minPrime; 82 * PrimeThread(long minPrime) { 83 * this.minPrime = minPrime; 84 * } 85 * 86 * public void run() { 87 * // compute primes larger than minPrime 88 * . . . 89 * } 90 * } 91 * </pre></blockquote><hr> 92 * <p> 93 * The following code would then create a thread and start it running: 94 * <blockquote><pre> 95 * PrimeThread p = new PrimeThread(143); 96 * p.start(); 97 * </pre></blockquote> 98 * <p> 99 * The other way to create a thread is to declare a class that 100 * implements the <code>Runnable</code> interface. That class then 101 * implements the <code>run</code> method. An instance of the class can 102 * then be allocated, passed as an argument when creating 103 * <code>Thread</code>, and started. The same example in this other 104 * style looks like the following: 105 * <hr><blockquote><pre> 106 * class PrimeRun implements Runnable { 107 * long minPrime; 108 * PrimeRun(long minPrime) { 109 * this.minPrime = minPrime; 110 * } 111 * 112 * public void run() { 113 * // compute primes larger than minPrime 114 * . . . 115 * } 116 * } 117 * </pre></blockquote><hr> 118 * <p> 119 * The following code would then create a thread and start it running: 120 * <blockquote><pre> 121 * PrimeRun p = new PrimeRun(143); 122 * new Thread(p).start(); 123 * </pre></blockquote> 124 * <p> 125 * Every thread has a name for identification purposes. More than 126 * one thread may have the same name. If a name is not specified when 127 * a thread is created, a new name is generated for it. 128 * <p> 129 * Unless otherwise noted, passing a {@code null} argument to a constructor 130 * or method in this class will cause a {@link NullPointerException} to be 131 * thrown. 132 * 133 * @author unascribed 134 * @see Runnable 135 * @see Runtime#exit(int) 136 * @see #run() 137 * @see #stop() 138 * @since 1.0 139 */ 140public 141class Thread implements Runnable { 142 /* Make sure registerNatives is the first thing <clinit> does. */ 143 private static native void registerNatives(); 144 static { 145 registerNatives(); 146 } 147 148 private volatile String name; 149 private int priority; 150 private Thread threadQ; 151 private long eetop; 152 153 /* Whether or not to single_step this thread. */ 154 private boolean single_step; 155 156 /* Whether or not the thread is a daemon thread. */ 157 private boolean daemon = false; 158 159 /* JVM state */ 160 private boolean stillborn = false; 161 162 /* What will be run. */ 163 private Runnable target; 164 165 /* The group of this thread */ 166 private ThreadGroup group; 167 168 /* The context ClassLoader for this thread */ 169 private ClassLoader contextClassLoader; 170 171 /* The inherited AccessControlContext of this thread */ 172 private AccessControlContext inheritedAccessControlContext; 173 174 /* For autonumbering anonymous threads. */ 175 private static int threadInitNumber; 176 private static synchronized int nextThreadNum() { 177 return threadInitNumber++; 178 } 179 180 /* ThreadLocal values pertaining to this thread. This map is maintained 181 * by the ThreadLocal class. */ 182 ThreadLocal.ThreadLocalMap threadLocals = null; 183 184 /* 185 * InheritableThreadLocal values pertaining to this thread. This map is 186 * maintained by the InheritableThreadLocal class. 187 */ 188 ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; 189 190 /* 191 * The requested stack size for this thread, or 0 if the creator did 192 * not specify a stack size. It is up to the VM to do whatever it 193 * likes with this number; some VMs will ignore it. 194 */ 195 private long stackSize; 196 197 /* 198 * JVM-private state that persists after native thread termination. 199 */ 200 private long nativeParkEventPointer; 201 202 /* 203 * Thread ID 204 */ 205 private long tid; 206 207 /* For generating thread ID */ 208 private static long threadSeqNumber; 209 210 /* Java thread status for tools, 211 * initialized to indicate thread 'not yet started' 212 */ 213 214 private volatile int threadStatus = 0; 215 216 217 private static synchronized long nextThreadID() { 218 return ++threadSeqNumber; 219 } 220 221 /** 222 * The argument supplied to the current call to 223 * java.util.concurrent.locks.LockSupport.park. 224 * Set by (private) java.util.concurrent.locks.LockSupport.setBlocker 225 * Accessed using java.util.concurrent.locks.LockSupport.getBlocker 226 */ 227 volatile Object parkBlocker; 228 229 /* The object in which this thread is blocked in an interruptible I/O 230 * operation, if any. The blocker's interrupt method should be invoked 231 * after setting this thread's interrupt status. 232 */ 233 private volatile Interruptible blocker; 234 private final Object blockerLock = new Object(); 235 236 /* Set the blocker field; invoked via jdk.internal.misc.SharedSecrets 237 * from java.nio code 238 */ 239 void blockedOn(Interruptible b) { 240 synchronized (blockerLock) { 241 blocker = b; 242 } 243 } 244 245 /** 246 * The minimum priority that a thread can have. 247 */ 248 public static final int MIN_PRIORITY = 1; 249 250 /** 251 * The default priority that is assigned to a thread. 252 */ 253 public static final int NORM_PRIORITY = 5; 254 255 /** 256 * The maximum priority that a thread can have. 257 */ 258 public static final int MAX_PRIORITY = 10; 259 260 /** 261 * Returns a reference to the currently executing thread object. 262 * 263 * @return the currently executing thread. 264 */ 265 @HotSpotIntrinsicCandidate 266 public static native Thread currentThread(); 267 268 /** 269 * A hint to the scheduler that the current thread is willing to yield 270 * its current use of a processor. The scheduler is free to ignore this 271 * hint. 272 * 273 * <p> Yield is a heuristic attempt to improve relative progression 274 * between threads that would otherwise over-utilise a CPU. Its use 275 * should be combined with detailed profiling and benchmarking to 276 * ensure that it actually has the desired effect. 277 * 278 * <p> It is rarely appropriate to use this method. It may be useful 279 * for debugging or testing purposes, where it may help to reproduce 280 * bugs due to race conditions. It may also be useful when designing 281 * concurrency control constructs such as the ones in the 282 * {@link java.util.concurrent.locks} package. 283 */ 284 public static native void yield(); 285 286 /** 287 * Causes the currently executing thread to sleep (temporarily cease 288 * execution) for the specified number of milliseconds, subject to 289 * the precision and accuracy of system timers and schedulers. The thread 290 * does not lose ownership of any monitors. 291 * 292 * @param millis 293 * the length of time to sleep in milliseconds 294 * 295 * @throws IllegalArgumentException 296 * if the value of {@code millis} is negative 297 * 298 * @throws InterruptedException 299 * if any thread has interrupted the current thread. The 300 * <i>interrupted status</i> of the current thread is 301 * cleared when this exception is thrown. 302 */ 303 public static native void sleep(long millis) throws InterruptedException; 304 305 /** 306 * Causes the currently executing thread to sleep (temporarily cease 307 * execution) for the specified number of milliseconds plus the specified 308 * number of nanoseconds, subject to the precision and accuracy of system 309 * timers and schedulers. The thread does not lose ownership of any 310 * monitors. 311 * 312 * @param millis 313 * the length of time to sleep in milliseconds 314 * 315 * @param nanos 316 * {@code 0-999999} additional nanoseconds to sleep 317 * 318 * @throws IllegalArgumentException 319 * if the value of {@code millis} is negative, or the value of 320 * {@code nanos} is not in the range {@code 0-999999} 321 * 322 * @throws InterruptedException 323 * if any thread has interrupted the current thread. The 324 * <i>interrupted status</i> of the current thread is 325 * cleared when this exception is thrown. 326 */ 327 public static void sleep(long millis, int nanos) 328 throws InterruptedException { 329 if (millis < 0) { 330 throw new IllegalArgumentException("timeout value is negative"); 331 } 332 333 if (nanos < 0 || nanos > 999999) { 334 throw new IllegalArgumentException( 335 "nanosecond timeout value out of range"); 336 } 337 338 if (nanos >= 500000 || (nanos != 0 && millis == 0)) { 339 millis++; 340 } 341 342 sleep(millis); 343 } 344 345 /** 346 * Initializes a Thread with the current AccessControlContext. 347 * @see #init(ThreadGroup,Runnable,String,long,AccessControlContext) 348 */ 349 private void init(ThreadGroup g, Runnable target, String name, 350 long stackSize) { 351 init(g, target, name, stackSize, null); 352 } 353 354 /** 355 * Initializes a Thread. 356 * 357 * @param g the Thread group 358 * @param target the object whose run() method gets called 359 * @param name the name of the new Thread 360 * @param stackSize the desired stack size for the new thread, or 361 * zero to indicate that this parameter is to be ignored. 362 * @param acc the AccessControlContext to inherit, or 363 * AccessController.getContext() if null 364 */ 365 private void init(ThreadGroup g, Runnable target, String name, 366 long stackSize, AccessControlContext acc) { 367 if (name == null) { 368 throw new NullPointerException("name cannot be null"); 369 } 370 371 this.name = name; 372 373 Thread parent = currentThread(); 374 SecurityManager security = System.getSecurityManager(); 375 if (g == null) { 376 /* Determine if it's an applet or not */ 377 378 /* If there is a security manager, ask the security manager 379 what to do. */ 380 if (security != null) { 381 g = security.getThreadGroup(); 382 } 383 384 /* If the security doesn't have a strong opinion of the matter 385 use the parent thread group. */ 386 if (g == null) { 387 g = parent.getThreadGroup(); 388 } 389 } 390 391 /* checkAccess regardless of whether or not threadgroup is 392 explicitly passed in. */ 393 g.checkAccess(); 394 395 /* 396 * Do we have the required permissions? 397 */ 398 if (security != null) { 399 if (isCCLOverridden(getClass())) { 400 security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); 401 } 402 } 403 404 g.addUnstarted(); 405 406 this.group = g; 407 this.daemon = parent.isDaemon(); 408 this.priority = parent.getPriority(); 409 if (security == null || isCCLOverridden(parent.getClass())) 410 this.contextClassLoader = parent.getContextClassLoader(); 411 else 412 this.contextClassLoader = parent.contextClassLoader; 413 this.inheritedAccessControlContext = 414 acc != null ? acc : AccessController.getContext(); 415 this.target = target; 416 setPriority(priority); 417 if (parent.inheritableThreadLocals != null) 418 this.inheritableThreadLocals = 419 ThreadLocal.createInheritedMap(parent.inheritableThreadLocals); 420 /* Stash the specified stack size in case the VM cares */ 421 this.stackSize = stackSize; 422 423 /* Set thread ID */ 424 tid = nextThreadID(); 425 } 426 427 /** 428 * Throws CloneNotSupportedException as a Thread can not be meaningfully 429 * cloned. Construct a new Thread instead. 430 * 431 * @throws CloneNotSupportedException 432 * always 433 */ 434 @Override 435 protected Object clone() throws CloneNotSupportedException { 436 throw new CloneNotSupportedException(); 437 } 438 439 /** 440 * Allocates a new {@code Thread} object. This constructor has the same 441 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 442 * {@code (null, null, gname)}, where {@code gname} is a newly generated 443 * name. Automatically generated names are of the form 444 * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer. 445 */ 446 public Thread() { 447 init(null, null, "Thread-" + nextThreadNum(), 0); 448 } 449 450 /** 451 * Allocates a new {@code Thread} object. This constructor has the same 452 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 453 * {@code (null, target, gname)}, where {@code gname} is a newly generated 454 * name. Automatically generated names are of the form 455 * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer. 456 * 457 * @param target 458 * the object whose {@code run} method is invoked when this thread 459 * is started. If {@code null}, this classes {@code run} method does 460 * nothing. 461 */ 462 public Thread(Runnable target) { 463 init(null, target, "Thread-" + nextThreadNum(), 0); 464 } 465 466 /** 467 * Creates a new Thread that inherits the given AccessControlContext. 468 * This is not a public constructor. 469 */ 470 Thread(Runnable target, AccessControlContext acc) { 471 init(null, target, "Thread-" + nextThreadNum(), 0, acc); 472 } 473 474 /** 475 * Allocates a new {@code Thread} object. This constructor has the same 476 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 477 * {@code (group, target, gname)} ,where {@code gname} is a newly generated 478 * name. Automatically generated names are of the form 479 * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer. 480 * 481 * @param group 482 * the thread group. If {@code null} and there is a security 483 * manager, the group is determined by {@linkplain 484 * SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 485 * If there is not a security manager or {@code 486 * SecurityManager.getThreadGroup()} returns {@code null}, the group 487 * is set to the current thread's thread group. 488 * 489 * @param target 490 * the object whose {@code run} method is invoked when this thread 491 * is started. If {@code null}, this thread's run method is invoked. 492 * 493 * @throws SecurityException 494 * if the current thread cannot create a thread in the specified 495 * thread group 496 */ 497 public Thread(ThreadGroup group, Runnable target) { 498 init(group, target, "Thread-" + nextThreadNum(), 0); 499 } 500 501 /** 502 * Allocates a new {@code Thread} object. This constructor has the same 503 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 504 * {@code (null, null, name)}. 505 * 506 * @param name 507 * the name of the new thread 508 */ 509 public Thread(String name) { 510 init(null, null, name, 0); 511 } 512 513 /** 514 * Allocates a new {@code Thread} object. This constructor has the same 515 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 516 * {@code (group, null, name)}. 517 * 518 * @param group 519 * the thread group. If {@code null} and there is a security 520 * manager, the group is determined by {@linkplain 521 * SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 522 * If there is not a security manager or {@code 523 * SecurityManager.getThreadGroup()} returns {@code null}, the group 524 * is set to the current thread's thread group. 525 * 526 * @param name 527 * the name of the new thread 528 * 529 * @throws SecurityException 530 * if the current thread cannot create a thread in the specified 531 * thread group 532 */ 533 public Thread(ThreadGroup group, String name) { 534 init(group, null, name, 0); 535 } 536 537 /** 538 * Allocates a new {@code Thread} object. This constructor has the same 539 * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 540 * {@code (null, target, name)}. 541 * 542 * @param target 543 * the object whose {@code run} method is invoked when this thread 544 * is started. If {@code null}, this thread's run method is invoked. 545 * 546 * @param name 547 * the name of the new thread 548 */ 549 public Thread(Runnable target, String name) { 550 init(null, target, name, 0); 551 } 552 553 /** 554 * Allocates a new {@code Thread} object so that it has {@code target} 555 * as its run object, has the specified {@code name} as its name, 556 * and belongs to the thread group referred to by {@code group}. 557 * 558 * <p>If there is a security manager, its 559 * {@link SecurityManager#checkAccess(ThreadGroup) checkAccess} 560 * method is invoked with the ThreadGroup as its argument. 561 * 562 * <p>In addition, its {@code checkPermission} method is invoked with 563 * the {@code RuntimePermission("enableContextClassLoaderOverride")} 564 * permission when invoked directly or indirectly by the constructor 565 * of a subclass which overrides the {@code getContextClassLoader} 566 * or {@code setContextClassLoader} methods. 567 * 568 * <p>The priority of the newly created thread is set equal to the 569 * priority of the thread creating it, that is, the currently running 570 * thread. The method {@linkplain #setPriority setPriority} may be 571 * used to change the priority to a new value. 572 * 573 * <p>The newly created thread is initially marked as being a daemon 574 * thread if and only if the thread creating it is currently marked 575 * as a daemon thread. The method {@linkplain #setDaemon setDaemon} 576 * may be used to change whether or not a thread is a daemon. 577 * 578 * @param group 579 * the thread group. If {@code null} and there is a security 580 * manager, the group is determined by {@linkplain 581 * SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 582 * If there is not a security manager or {@code 583 * SecurityManager.getThreadGroup()} returns {@code null}, the group 584 * is set to the current thread's thread group. 585 * 586 * @param target 587 * the object whose {@code run} method is invoked when this thread 588 * is started. If {@code null}, this thread's run method is invoked. 589 * 590 * @param name 591 * the name of the new thread 592 * 593 * @throws SecurityException 594 * if the current thread cannot create a thread in the specified 595 * thread group or cannot override the context class loader methods. 596 */ 597 public Thread(ThreadGroup group, Runnable target, String name) { 598 init(group, target, name, 0); 599 } 600 601 /** 602 * Allocates a new {@code Thread} object so that it has {@code target} 603 * as its run object, has the specified {@code name} as its name, 604 * and belongs to the thread group referred to by {@code group}, and has 605 * the specified <i>stack size</i>. 606 * 607 * <p>This constructor is identical to {@link 608 * #Thread(ThreadGroup,Runnable,String)} with the exception of the fact 609 * that it allows the thread stack size to be specified. The stack size 610 * is the approximate number of bytes of address space that the virtual 611 * machine is to allocate for this thread's stack. <b>The effect of the 612 * {@code stackSize} parameter, if any, is highly platform dependent.</b> 613 * 614 * <p>On some platforms, specifying a higher value for the 615 * {@code stackSize} parameter may allow a thread to achieve greater 616 * recursion depth before throwing a {@link StackOverflowError}. 617 * Similarly, specifying a lower value may allow a greater number of 618 * threads to exist concurrently without throwing an {@link 619 * OutOfMemoryError} (or other internal error). The details of 620 * the relationship between the value of the {@code stackSize} parameter 621 * and the maximum recursion depth and concurrency level are 622 * platform-dependent. <b>On some platforms, the value of the 623 * {@code stackSize} parameter may have no effect whatsoever.</b> 624 * 625 * <p>The virtual machine is free to treat the {@code stackSize} 626 * parameter as a suggestion. If the specified value is unreasonably low 627 * for the platform, the virtual machine may instead use some 628 * platform-specific minimum value; if the specified value is unreasonably 629 * high, the virtual machine may instead use some platform-specific 630 * maximum. Likewise, the virtual machine is free to round the specified 631 * value up or down as it sees fit (or to ignore it completely). 632 * 633 * <p>Specifying a value of zero for the {@code stackSize} parameter will 634 * cause this constructor to behave exactly like the 635 * {@code Thread(ThreadGroup, Runnable, String)} constructor. 636 * 637 * <p><i>Due to the platform-dependent nature of the behavior of this 638 * constructor, extreme care should be exercised in its use. 639 * The thread stack size necessary to perform a given computation will 640 * likely vary from one JRE implementation to another. In light of this 641 * variation, careful tuning of the stack size parameter may be required, 642 * and the tuning may need to be repeated for each JRE implementation on 643 * which an application is to run.</i> 644 * 645 * <p>Implementation note: Java platform implementers are encouraged to 646 * document their implementation's behavior with respect to the 647 * {@code stackSize} parameter. 648 * 649 * 650 * @param group 651 * the thread group. If {@code null} and there is a security 652 * manager, the group is determined by {@linkplain 653 * SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 654 * If there is not a security manager or {@code 655 * SecurityManager.getThreadGroup()} returns {@code null}, the group 656 * is set to the current thread's thread group. 657 * 658 * @param target 659 * the object whose {@code run} method is invoked when this thread 660 * is started. If {@code null}, this thread's run method is invoked. 661 * 662 * @param name 663 * the name of the new thread 664 * 665 * @param stackSize 666 * the desired stack size for the new thread, or zero to indicate 667 * that this parameter is to be ignored. 668 * 669 * @throws SecurityException 670 * if the current thread cannot create a thread in the specified 671 * thread group 672 * 673 * @since 1.4 674 */ 675 public Thread(ThreadGroup group, Runnable target, String name, 676 long stackSize) { 677 init(group, target, name, stackSize); 678 } 679 680 /** 681 * Causes this thread to begin execution; the Java Virtual Machine 682 * calls the <code>run</code> method of this thread. 683 * <p> 684 * The result is that two threads are running concurrently: the 685 * current thread (which returns from the call to the 686 * <code>start</code> method) and the other thread (which executes its 687 * <code>run</code> method). 688 * <p> 689 * It is never legal to start a thread more than once. 690 * In particular, a thread may not be restarted once it has completed 691 * execution. 692 * 693 * @exception IllegalThreadStateException if the thread was already 694 * started. 695 * @see #run() 696 * @see #stop() 697 */ 698 public synchronized void start() { 699 /** 700 * This method is not invoked for the main method thread or "system" 701 * group threads created/set up by the VM. Any new functionality added 702 * to this method in the future may have to also be added to the VM. 703 * 704 * A zero status value corresponds to state "NEW". 705 */ 706 if (threadStatus != 0) 707 throw new IllegalThreadStateException(); 708 709 /* Notify the group that this thread is about to be started 710 * so that it can be added to the group's list of threads 711 * and the group's unstarted count can be decremented. */ 712 group.add(this); 713 714 boolean started = false; 715 try { 716 start0(); 717 started = true; 718 } finally { 719 try { 720 if (!started) { 721 group.threadStartFailed(this); 722 } 723 } catch (Throwable ignore) { 724 /* do nothing. If start0 threw a Throwable then 725 it will be passed up the call stack */ 726 } 727 } 728 } 729 730 private native void start0(); 731 732 /** 733 * If this thread was constructed using a separate 734 * <code>Runnable</code> run object, then that 735 * <code>Runnable</code> object's <code>run</code> method is called; 736 * otherwise, this method does nothing and returns. 737 * <p> 738 * Subclasses of <code>Thread</code> should override this method. 739 * 740 * @see #start() 741 * @see #stop() 742 * @see #Thread(ThreadGroup, Runnable, String) 743 */ 744 @Override 745 public void run() { 746 if (target != null) { 747 target.run(); 748 } 749 } 750 751 /** 752 * This method is called by the system to give a Thread 753 * a chance to clean up before it actually exits. 754 */ 755 private void exit() { 756 if (group != null) { 757 group.threadTerminated(this); 758 group = null; 759 } 760 /* Aggressively null out all reference fields: see bug 4006245 */ 761 target = null; 762 /* Speed the release of some of these resources */ 763 threadLocals = null; 764 inheritableThreadLocals = null; 765 inheritedAccessControlContext = null; 766 blocker = null; 767 uncaughtExceptionHandler = null; 768 } 769 770 /** 771 * Forces the thread to stop executing. 772 * <p> 773 * If there is a security manager installed, its <code>checkAccess</code> 774 * method is called with <code>this</code> 775 * as its argument. This may result in a 776 * <code>SecurityException</code> being raised (in the current thread). 777 * <p> 778 * If this thread is different from the current thread (that is, the current 779 * thread is trying to stop a thread other than itself), the 780 * security manager's <code>checkPermission</code> method (with a 781 * <code>RuntimePermission("stopThread")</code> argument) is called in 782 * addition. 783 * Again, this may result in throwing a 784 * <code>SecurityException</code> (in the current thread). 785 * <p> 786 * The thread represented by this thread is forced to stop whatever 787 * it is doing abnormally and to throw a newly created 788 * <code>ThreadDeath</code> object as an exception. 789 * <p> 790 * It is permitted to stop a thread that has not yet been started. 791 * If the thread is eventually started, it immediately terminates. 792 * <p> 793 * An application should not normally try to catch 794 * <code>ThreadDeath</code> unless it must do some extraordinary 795 * cleanup operation (note that the throwing of 796 * <code>ThreadDeath</code> causes <code>finally</code> clauses of 797 * <code>try</code> statements to be executed before the thread 798 * officially dies). If a <code>catch</code> clause catches a 799 * <code>ThreadDeath</code> object, it is important to rethrow the 800 * object so that the thread actually dies. 801 * <p> 802 * The top-level error handler that reacts to otherwise uncaught 803 * exceptions does not print out a message or otherwise notify the 804 * application if the uncaught exception is an instance of 805 * <code>ThreadDeath</code>. 806 * 807 * @exception SecurityException if the current thread cannot 808 * modify this thread. 809 * @see #interrupt() 810 * @see #checkAccess() 811 * @see #run() 812 * @see #start() 813 * @see ThreadDeath 814 * @see ThreadGroup#uncaughtException(Thread,Throwable) 815 * @see SecurityManager#checkAccess(Thread) 816 * @see SecurityManager#checkPermission 817 * @deprecated This method is inherently unsafe. Stopping a thread with 818 * Thread.stop causes it to unlock all of the monitors that it 819 * has locked (as a natural consequence of the unchecked 820 * <code>ThreadDeath</code> exception propagating up the stack). If 821 * any of the objects previously protected by these monitors were in 822 * an inconsistent state, the damaged objects become visible to 823 * other threads, potentially resulting in arbitrary behavior. Many 824 * uses of <code>stop</code> should be replaced by code that simply 825 * modifies some variable to indicate that the target thread should 826 * stop running. The target thread should check this variable 827 * regularly, and return from its run method in an orderly fashion 828 * if the variable indicates that it is to stop running. If the 829 * target thread waits for long periods (on a condition variable, 830 * for example), the <code>interrupt</code> method should be used to 831 * interrupt the wait. 832 * For more information, see 833 * <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why 834 * are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>. 835 */ 836 @Deprecated 837 public final void stop() { 838 SecurityManager security = System.getSecurityManager(); 839 if (security != null) { 840 checkAccess(); 841 if (this != Thread.currentThread()) { 842 security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION); 843 } 844 } 845 // A zero status value corresponds to "NEW", it can't change to 846 // not-NEW because we hold the lock. 847 if (threadStatus != 0) { 848 resume(); // Wake up thread if it was suspended; no-op otherwise 849 } 850 851 // The VM can handle all thread states 852 stop0(new ThreadDeath()); 853 } 854 855 /** 856 * Throws {@code UnsupportedOperationException}. 857 * 858 * @param obj ignored 859 * 860 * @deprecated This method was originally designed to force a thread to stop 861 * and throw a given {@code Throwable} as an exception. It was 862 * inherently unsafe (see {@link #stop()} for details), and furthermore 863 * could be used to generate exceptions that the target thread was 864 * not prepared to handle. 865 * For more information, see 866 * <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why 867 * are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>. 868 */ 869 @Deprecated 870 public final synchronized void stop(Throwable obj) { 871 throw new UnsupportedOperationException(); 872 } 873 874 /** 875 * Interrupts this thread. 876 * 877 * <p> Unless the current thread is interrupting itself, which is 878 * always permitted, the {@link #checkAccess() checkAccess} method 879 * of this thread is invoked, which may cause a {@link 880 * SecurityException} to be thrown. 881 * 882 * <p> If this thread is blocked in an invocation of the {@link 883 * Object#wait() wait()}, {@link Object#wait(long) wait(long)}, or {@link 884 * Object#wait(long, int) wait(long, int)} methods of the {@link Object} 885 * class, or of the {@link #join()}, {@link #join(long)}, {@link 886 * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)}, 887 * methods of this class, then its interrupt status will be cleared and it 888 * will receive an {@link InterruptedException}. 889 * 890 * <p> If this thread is blocked in an I/O operation upon an {@link 891 * java.nio.channels.InterruptibleChannel InterruptibleChannel} 892 * then the channel will be closed, the thread's interrupt 893 * status will be set, and the thread will receive a {@link 894 * java.nio.channels.ClosedByInterruptException}. 895 * 896 * <p> If this thread is blocked in a {@link java.nio.channels.Selector} 897 * then the thread's interrupt status will be set and it will return 898 * immediately from the selection operation, possibly with a non-zero 899 * value, just as if the selector's {@link 900 * java.nio.channels.Selector#wakeup wakeup} method were invoked. 901 * 902 * <p> If none of the previous conditions hold then this thread's interrupt 903 * status will be set. </p> 904 * 905 * <p> Interrupting a thread that is not alive need not have any effect. 906 * 907 * @throws SecurityException 908 * if the current thread cannot modify this thread 909 * 910 * @revised 6.0 911 * @spec JSR-51 912 */ 913 public void interrupt() { 914 if (this != Thread.currentThread()) 915 checkAccess(); 916 917 synchronized (blockerLock) { 918 Interruptible b = blocker; 919 if (b != null) { 920 interrupt0(); // Just to set the interrupt flag 921 b.interrupt(this); 922 return; 923 } 924 } 925 interrupt0(); 926 } 927 928 /** 929 * Tests whether the current thread has been interrupted. The 930 * <i>interrupted status</i> of the thread is cleared by this method. In 931 * other words, if this method were to be called twice in succession, the 932 * second call would return false (unless the current thread were 933 * interrupted again, after the first call had cleared its interrupted 934 * status and before the second call had examined it). 935 * 936 * <p>A thread interruption ignored because a thread was not alive 937 * at the time of the interrupt will be reflected by this method 938 * returning false. 939 * 940 * @return <code>true</code> if the current thread has been interrupted; 941 * <code>false</code> otherwise. 942 * @see #isInterrupted() 943 * @revised 6.0 944 */ 945 public static boolean interrupted() { 946 return currentThread().isInterrupted(true); 947 } 948 949 /** 950 * Tests whether this thread has been interrupted. The <i>interrupted 951 * status</i> of the thread is unaffected by this method. 952 * 953 * <p>A thread interruption ignored because a thread was not alive 954 * at the time of the interrupt will be reflected by this method 955 * returning false. 956 * 957 * @return <code>true</code> if this thread has been interrupted; 958 * <code>false</code> otherwise. 959 * @see #interrupted() 960 * @revised 6.0 961 */ 962 public boolean isInterrupted() { 963 return isInterrupted(false); 964 } 965 966 /** 967 * Tests if some Thread has been interrupted. The interrupted state 968 * is reset or not based on the value of ClearInterrupted that is 969 * passed. 970 */ 971 @HotSpotIntrinsicCandidate 972 private native boolean isInterrupted(boolean ClearInterrupted); 973 974 /** 975 * Throws {@link NoSuchMethodError}. 976 * 977 * @deprecated This method was originally designed to destroy this 978 * thread without any cleanup. Any monitors it held would have 979 * remained locked. However, the method was never implemented. 980 * If it were to be implemented, it would be deadlock-prone in 981 * much the manner of {@link #suspend}. If the target thread held 982 * a lock protecting a critical system resource when it was 983 * destroyed, no thread could ever access this resource again. 984 * If another thread ever attempted to lock this resource, deadlock 985 * would result. Such deadlocks typically manifest themselves as 986 * "frozen" processes. For more information, see 987 * <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html"> 988 * Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>. 989 * @throws NoSuchMethodError always 990 */ 991 @Deprecated 992 public void destroy() { 993 throw new NoSuchMethodError(); 994 } 995 996 /** 997 * Tests if this thread is alive. A thread is alive if it has 998 * been started and has not yet died. 999 * 1000 * @return <code>true</code> if this thread is alive; 1001 * <code>false</code> otherwise. 1002 */ 1003 public final native boolean isAlive(); 1004 1005 /** 1006 * Suspends this thread. 1007 * <p> 1008 * First, the <code>checkAccess</code> method of this thread is called 1009 * with no arguments. This may result in throwing a 1010 * <code>SecurityException </code>(in the current thread). 1011 * <p> 1012 * If the thread is alive, it is suspended and makes no further 1013 * progress unless and until it is resumed. 1014 * 1015 * @exception SecurityException if the current thread cannot modify 1016 * this thread. 1017 * @see #checkAccess 1018 * @deprecated This method has been deprecated, as it is 1019 * inherently deadlock-prone. If the target thread holds a lock on the 1020 * monitor protecting a critical system resource when it is suspended, no 1021 * thread can access this resource until the target thread is resumed. If 1022 * the thread that would resume the target thread attempts to lock this 1023 * monitor prior to calling <code>resume</code>, deadlock results. Such 1024 * deadlocks typically manifest themselves as "frozen" processes. 1025 * For more information, see 1026 * <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why 1027 * are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>. 1028 */ 1029 @Deprecated 1030 public final void suspend() { 1031 checkAccess(); 1032 suspend0(); 1033 } 1034 1035 /** 1036 * Resumes a suspended thread. 1037 * <p> 1038 * First, the <code>checkAccess</code> method of this thread is called 1039 * with no arguments. This may result in throwing a 1040 * <code>SecurityException</code> (in the current thread). 1041 * <p> 1042 * If the thread is alive but suspended, it is resumed and is 1043 * permitted to make progress in its execution. 1044 * 1045 * @exception SecurityException if the current thread cannot modify this 1046 * thread. 1047 * @see #checkAccess 1048 * @see #suspend() 1049 * @deprecated This method exists solely for use with {@link #suspend}, 1050 * which has been deprecated because it is deadlock-prone. 1051 * For more information, see 1052 * <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why 1053 * are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>. 1054 */ 1055 @Deprecated 1056 public final void resume() { 1057 checkAccess(); 1058 resume0(); 1059 } 1060 1061 /** 1062 * Changes the priority of this thread. 1063 * <p> 1064 * First the <code>checkAccess</code> method of this thread is called 1065 * with no arguments. This may result in throwing a 1066 * <code>SecurityException</code>. 1067 * <p> 1068 * Otherwise, the priority of this thread is set to the smaller of 1069 * the specified <code>newPriority</code> and the maximum permitted 1070 * priority of the thread's thread group. 1071 * 1072 * @param newPriority priority to set this thread to 1073 * @exception IllegalArgumentException If the priority is not in the 1074 * range <code>MIN_PRIORITY</code> to 1075 * <code>MAX_PRIORITY</code>. 1076 * @exception SecurityException if the current thread cannot modify 1077 * this thread. 1078 * @see #getPriority 1079 * @see #checkAccess() 1080 * @see #getThreadGroup() 1081 * @see #MAX_PRIORITY 1082 * @see #MIN_PRIORITY 1083 * @see ThreadGroup#getMaxPriority() 1084 */ 1085 public final void setPriority(int newPriority) { 1086 ThreadGroup g; 1087 checkAccess(); 1088 if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { 1089 throw new IllegalArgumentException(); 1090 } 1091 if((g = getThreadGroup()) != null) { 1092 if (newPriority > g.getMaxPriority()) { 1093 newPriority = g.getMaxPriority(); 1094 } 1095 setPriority0(priority = newPriority); 1096 } 1097 } 1098 1099 /** 1100 * Returns this thread's priority. 1101 * 1102 * @return this thread's priority. 1103 * @see #setPriority 1104 */ 1105 public final int getPriority() { 1106 return priority; 1107 } 1108 1109 /** 1110 * Changes the name of this thread to be equal to the argument 1111 * <code>name</code>. 1112 * <p> 1113 * First the <code>checkAccess</code> method of this thread is called 1114 * with no arguments. This may result in throwing a 1115 * <code>SecurityException</code>. 1116 * 1117 * @param name the new name for this thread. 1118 * @exception SecurityException if the current thread cannot modify this 1119 * thread. 1120 * @see #getName 1121 * @see #checkAccess() 1122 */ 1123 public final synchronized void setName(String name) { 1124 checkAccess(); 1125 if (name == null) { 1126 throw new NullPointerException("name cannot be null"); 1127 } 1128 1129 this.name = name; 1130 if (threadStatus != 0) { 1131 setNativeName(name); 1132 } 1133 } 1134 1135 /** 1136 * Returns this thread's name. 1137 * 1138 * @return this thread's name. 1139 * @see #setName(String) 1140 */ 1141 public final String getName() { 1142 return name; 1143 } 1144 1145 /** 1146 * Returns the thread group to which this thread belongs. 1147 * This method returns null if this thread has died 1148 * (been stopped). 1149 * 1150 * @return this thread's thread group. 1151 */ 1152 public final ThreadGroup getThreadGroup() { 1153 return group; 1154 } 1155 1156 /** 1157 * Returns an estimate of the number of active threads in the current 1158 * thread's {@linkplain java.lang.ThreadGroup thread group} and its 1159 * subgroups. Recursively iterates over all subgroups in the current 1160 * thread's thread group. 1161 * 1162 * <p> The value returned is only an estimate because the number of 1163 * threads may change dynamically while this method traverses internal 1164 * data structures, and might be affected by the presence of certain 1165 * system threads. This method is intended primarily for debugging 1166 * and monitoring purposes. 1167 * 1168 * @return an estimate of the number of active threads in the current 1169 * thread's thread group and in any other thread group that 1170 * has the current thread's thread group as an ancestor 1171 */ 1172 public static int activeCount() { 1173 return currentThread().getThreadGroup().activeCount(); 1174 } 1175 1176 /** 1177 * Copies into the specified array every active thread in the current 1178 * thread's thread group and its subgroups. This method simply 1179 * invokes the {@link java.lang.ThreadGroup#enumerate(Thread[])} 1180 * method of the current thread's thread group. 1181 * 1182 * <p> An application might use the {@linkplain #activeCount activeCount} 1183 * method to get an estimate of how big the array should be, however 1184 * <i>if the array is too short to hold all the threads, the extra threads 1185 * are silently ignored.</i> If it is critical to obtain every active 1186 * thread in the current thread's thread group and its subgroups, the 1187 * invoker should verify that the returned int value is strictly less 1188 * than the length of {@code tarray}. 1189 * 1190 * <p> Due to the inherent race condition in this method, it is recommended 1191 * that the method only be used for debugging and monitoring purposes. 1192 * 1193 * @param tarray 1194 * an array into which to put the list of threads 1195 * 1196 * @return the number of threads put into the array 1197 * 1198 * @throws SecurityException 1199 * if {@link java.lang.ThreadGroup#checkAccess} determines that 1200 * the current thread cannot access its thread group 1201 */ 1202 public static int enumerate(Thread tarray[]) { 1203 return currentThread().getThreadGroup().enumerate(tarray); 1204 } 1205 1206 /** 1207 * Counts the number of stack frames in this thread. The thread must 1208 * be suspended. 1209 * 1210 * @return the number of stack frames in this thread. 1211 * @exception IllegalThreadStateException if this thread is not 1212 * suspended. 1213 * @deprecated The definition of this call depends on {@link #suspend}, 1214 * which is deprecated. Further, the results of this call 1215 * were never well-defined. 1216 */ 1217 @Deprecated 1218 public native int countStackFrames(); 1219 1220 /** 1221 * Waits at most {@code millis} milliseconds for this thread to 1222 * die. A timeout of {@code 0} means to wait forever. 1223 * 1224 * <p> This implementation uses a loop of {@code this.wait} calls 1225 * conditioned on {@code this.isAlive}. As a thread terminates the 1226 * {@code this.notifyAll} method is invoked. It is recommended that 1227 * applications not use {@code wait}, {@code notify}, or 1228 * {@code notifyAll} on {@code Thread} instances. 1229 * 1230 * @param millis 1231 * the time to wait in milliseconds 1232 * 1233 * @throws IllegalArgumentException 1234 * if the value of {@code millis} is negative 1235 * 1236 * @throws InterruptedException 1237 * if any thread has interrupted the current thread. The 1238 * <i>interrupted status</i> of the current thread is 1239 * cleared when this exception is thrown. 1240 */ 1241 public final synchronized void join(long millis) 1242 throws InterruptedException { 1243 long base = System.currentTimeMillis(); 1244 long now = 0; 1245 1246 if (millis < 0) { 1247 throw new IllegalArgumentException("timeout value is negative"); 1248 } 1249 1250 if (millis == 0) { 1251 while (isAlive()) { 1252 wait(0); 1253 } 1254 } else { 1255 while (isAlive()) { 1256 long delay = millis - now; 1257 if (delay <= 0) { 1258 break; 1259 } 1260 wait(delay); 1261 now = System.currentTimeMillis() - base; 1262 } 1263 } 1264 } 1265 1266 /** 1267 * Waits at most {@code millis} milliseconds plus 1268 * {@code nanos} nanoseconds for this thread to die. 1269 * 1270 * <p> This implementation uses a loop of {@code this.wait} calls 1271 * conditioned on {@code this.isAlive}. As a thread terminates the 1272 * {@code this.notifyAll} method is invoked. It is recommended that 1273 * applications not use {@code wait}, {@code notify}, or 1274 * {@code notifyAll} on {@code Thread} instances. 1275 * 1276 * @param millis 1277 * the time to wait in milliseconds 1278 * 1279 * @param nanos 1280 * {@code 0-999999} additional nanoseconds to wait 1281 * 1282 * @throws IllegalArgumentException 1283 * if the value of {@code millis} is negative, or the value 1284 * of {@code nanos} is not in the range {@code 0-999999} 1285 * 1286 * @throws InterruptedException 1287 * if any thread has interrupted the current thread. The 1288 * <i>interrupted status</i> of the current thread is 1289 * cleared when this exception is thrown. 1290 */ 1291 public final synchronized void join(long millis, int nanos) 1292 throws InterruptedException { 1293 1294 if (millis < 0) { 1295 throw new IllegalArgumentException("timeout value is negative"); 1296 } 1297 1298 if (nanos < 0 || nanos > 999999) { 1299 throw new IllegalArgumentException( 1300 "nanosecond timeout value out of range"); 1301 } 1302 1303 if (nanos >= 500000 || (nanos != 0 && millis == 0)) { 1304 millis++; 1305 } 1306 1307 join(millis); 1308 } 1309 1310 /** 1311 * Waits for this thread to die. 1312 * 1313 * <p> An invocation of this method behaves in exactly the same 1314 * way as the invocation 1315 * 1316 * <blockquote> 1317 * {@linkplain #join(long) join}{@code (0)} 1318 * </blockquote> 1319 * 1320 * @throws InterruptedException 1321 * if any thread has interrupted the current thread. The 1322 * <i>interrupted status</i> of the current thread is 1323 * cleared when this exception is thrown. 1324 */ 1325 public final void join() throws InterruptedException { 1326 join(0); 1327 } 1328 1329 /** 1330 * Prints a stack trace of the current thread to the standard error stream. 1331 * This method is used only for debugging. 1332 */ 1333 public static void dumpStack() { 1334 StackStreamFactory.makeStackTrace().printStackTrace(System.err); 1335 } 1336 1337 /** 1338 * Marks this thread as either a {@linkplain #isDaemon daemon} thread 1339 * or a user thread. The Java Virtual Machine exits when the only 1340 * threads running are all daemon threads. 1341 * 1342 * <p> This method must be invoked before the thread is started. 1343 * 1344 * @param on 1345 * if {@code true}, marks this thread as a daemon thread 1346 * 1347 * @throws IllegalThreadStateException 1348 * if this thread is {@linkplain #isAlive alive} 1349 * 1350 * @throws SecurityException 1351 * if {@link #checkAccess} determines that the current 1352 * thread cannot modify this thread 1353 */ 1354 public final void setDaemon(boolean on) { 1355 checkAccess(); 1356 if (isAlive()) { 1357 throw new IllegalThreadStateException(); 1358 } 1359 daemon = on; 1360 } 1361 1362 /** 1363 * Tests if this thread is a daemon thread. 1364 * 1365 * @return <code>true</code> if this thread is a daemon thread; 1366 * <code>false</code> otherwise. 1367 * @see #setDaemon(boolean) 1368 */ 1369 public final boolean isDaemon() { 1370 return daemon; 1371 } 1372 1373 /** 1374 * Determines if the currently running thread has permission to 1375 * modify this thread. 1376 * <p> 1377 * If there is a security manager, its <code>checkAccess</code> method 1378 * is called with this thread as its argument. This may result in 1379 * throwing a <code>SecurityException</code>. 1380 * 1381 * @exception SecurityException if the current thread is not allowed to 1382 * access this thread. 1383 * @see SecurityManager#checkAccess(Thread) 1384 */ 1385 public final void checkAccess() { 1386 SecurityManager security = System.getSecurityManager(); 1387 if (security != null) { 1388 security.checkAccess(this); 1389 } 1390 } 1391 1392 /** 1393 * Returns a string representation of this thread, including the 1394 * thread's name, priority, and thread group. 1395 * 1396 * @return a string representation of this thread. 1397 */ 1398 public String toString() { 1399 ThreadGroup group = getThreadGroup(); 1400 if (group != null) { 1401 return "Thread[" + getName() + "," + getPriority() + "," + 1402 group.getName() + "]"; 1403 } else { 1404 return "Thread[" + getName() + "," + getPriority() + "," + 1405 "" + "]"; 1406 } 1407 } 1408 1409 /** 1410 * Returns the context ClassLoader for this Thread. The context 1411 * ClassLoader is provided by the creator of the thread for use 1412 * by code running in this thread when loading classes and resources. 1413 * If not {@linkplain #setContextClassLoader set}, the default is the 1414 * ClassLoader context of the parent Thread. The context ClassLoader of the 1415 * primordial thread is typically set to the class loader used to load the 1416 * application. 1417 * 1418 * <p>If a security manager is present, and the invoker's class loader is not 1419 * {@code null} and is not the same as or an ancestor of the context class 1420 * loader, then this method invokes the security manager's {@link 1421 * SecurityManager#checkPermission(java.security.Permission) checkPermission} 1422 * method with a {@link RuntimePermission RuntimePermission}{@code 1423 * ("getClassLoader")} permission to verify that retrieval of the context 1424 * class loader is permitted. 1425 * 1426 * @return the context ClassLoader for this Thread, or {@code null} 1427 * indicating the system class loader (or, failing that, the 1428 * bootstrap class loader) 1429 * 1430 * @throws SecurityException 1431 * if the current thread cannot get the context ClassLoader 1432 * 1433 * @since 1.2 1434 */ 1435 @CallerSensitive 1436 public ClassLoader getContextClassLoader() { 1437 if (contextClassLoader == null) 1438 return null; 1439 SecurityManager sm = System.getSecurityManager(); 1440 if (sm != null) { 1441 ClassLoader.checkClassLoaderPermission(contextClassLoader, 1442 Reflection.getCallerClass()); 1443 } 1444 return contextClassLoader; 1445 } 1446 1447 /** 1448 * Sets the context ClassLoader for this Thread. The context 1449 * ClassLoader can be set when a thread is created, and allows 1450 * the creator of the thread to provide the appropriate class loader, 1451 * through {@code getContextClassLoader}, to code running in the thread 1452 * when loading classes and resources. 1453 * 1454 * <p>If a security manager is present, its {@link 1455 * SecurityManager#checkPermission(java.security.Permission) checkPermission} 1456 * method is invoked with a {@link RuntimePermission RuntimePermission}{@code 1457 * ("setContextClassLoader")} permission to see if setting the context 1458 * ClassLoader is permitted. 1459 * 1460 * @param cl 1461 * the context ClassLoader for this Thread, or null indicating the 1462 * system class loader (or, failing that, the bootstrap class loader) 1463 * 1464 * @throws SecurityException 1465 * if the current thread cannot set the context ClassLoader 1466 * 1467 * @since 1.2 1468 */ 1469 public void setContextClassLoader(ClassLoader cl) { 1470 SecurityManager sm = System.getSecurityManager(); 1471 if (sm != null) { 1472 sm.checkPermission(new RuntimePermission("setContextClassLoader")); 1473 } 1474 contextClassLoader = cl; 1475 } 1476 1477 /** 1478 * Returns {@code true} if and only if the current thread holds the 1479 * monitor lock on the specified object. 1480 * 1481 * <p>This method is designed to allow a program to assert that 1482 * the current thread already holds a specified lock: 1483 * <pre> 1484 * assert Thread.holdsLock(obj); 1485 * </pre> 1486 * 1487 * @param obj the object on which to test lock ownership 1488 * @throws NullPointerException if obj is {@code null} 1489 * @return {@code true} if the current thread holds the monitor lock on 1490 * the specified object. 1491 * @since 1.4 1492 */ 1493 public static native boolean holdsLock(Object obj); 1494 1495 private static final StackTraceElement[] EMPTY_STACK_TRACE 1496 = new StackTraceElement[0]; 1497 1498 /** 1499 * Returns an array of stack trace elements representing the stack dump 1500 * of this thread. This method will return a zero-length array if 1501 * this thread has not started, has started but has not yet been 1502 * scheduled to run by the system, or has terminated. 1503 * If the returned array is of non-zero length then the first element of 1504 * the array represents the top of the stack, which is the most recent 1505 * method invocation in the sequence. The last element of the array 1506 * represents the bottom of the stack, which is the least recent method 1507 * invocation in the sequence. 1508 * 1509 * <p>If there is a security manager, and this thread is not 1510 * the current thread, then the security manager's 1511 * {@code checkPermission} method is called with a 1512 * {@code RuntimePermission("getStackTrace")} permission 1513 * to see if it's ok to get the stack trace. 1514 * 1515 * <p>Some virtual machines may, under some circumstances, omit one 1516 * or more stack frames from the stack trace. In the extreme case, 1517 * a virtual machine that has no stack trace information concerning 1518 * this thread is permitted to return a zero-length array from this 1519 * method. 1520 * 1521 * @return an array of {@code StackTraceElement}, 1522 * each represents one stack frame. 1523 * 1524 * @throws SecurityException 1525 * if a security manager exists and its 1526 * {@code checkPermission} method doesn't allow 1527 * getting the stack trace of thread. 1528 * @see SecurityManager#checkPermission 1529 * @see RuntimePermission 1530 * @see Throwable#getStackTrace 1531 * 1532 * @since 1.5 1533 */ 1534 public StackTraceElement[] getStackTrace() { 1535 if (this != Thread.currentThread()) { 1536 // check for getStackTrace permission 1537 SecurityManager security = System.getSecurityManager(); 1538 if (security != null) { 1539 security.checkPermission( 1540 SecurityConstants.GET_STACK_TRACE_PERMISSION); 1541 } 1542 // optimization so we do not call into the vm for threads that 1543 // have not yet started or have terminated 1544 if (!isAlive()) { 1545 return EMPTY_STACK_TRACE; 1546 } 1547 StackTraceElement[][] stackTraceArray = dumpThreads(new Thread[] {this}); 1548 StackTraceElement[] stackTrace = stackTraceArray[0]; 1549 // a thread that was alive during the previous isAlive call may have 1550 // since terminated, therefore not having a stacktrace. 1551 if (stackTrace == null) { 1552 stackTrace = EMPTY_STACK_TRACE; 1553 } 1554 return stackTrace; 1555 } else { 1556 // Don't need JVM help for current thread 1557 return StackStreamFactory.makeStackTrace().getStackTraceElements(); 1558 } 1559 } 1560 1561 /** 1562 * Returns a map of stack traces for all live threads. 1563 * The map keys are threads and each map value is an array of 1564 * {@code StackTraceElement} that represents the stack dump 1565 * of the corresponding {@code Thread}. 1566 * The returned stack traces are in the format specified for 1567 * the {@link #getStackTrace getStackTrace} method. 1568 * 1569 * <p>The threads may be executing while this method is called. 1570 * The stack trace of each thread only represents a snapshot and 1571 * each stack trace may be obtained at different time. A zero-length 1572 * array will be returned in the map value if the virtual machine has 1573 * no stack trace information about a thread. 1574 * 1575 * <p>If there is a security manager, then the security manager's 1576 * {@code checkPermission} method is called with a 1577 * {@code RuntimePermission("getStackTrace")} permission as well as 1578 * {@code RuntimePermission("modifyThreadGroup")} permission 1579 * to see if it is ok to get the stack trace of all threads. 1580 * 1581 * @return a {@code Map} from {@code Thread} to an array of 1582 * {@code StackTraceElement} that represents the stack trace of 1583 * the corresponding thread. 1584 * 1585 * @throws SecurityException 1586 * if a security manager exists and its 1587 * {@code checkPermission} method doesn't allow 1588 * getting the stack trace of thread. 1589 * @see #getStackTrace 1590 * @see SecurityManager#checkPermission 1591 * @see RuntimePermission 1592 * @see Throwable#getStackTrace 1593 * 1594 * @since 1.5 1595 */ 1596 public static Map<Thread, StackTraceElement[]> getAllStackTraces() { 1597 // check for getStackTrace permission 1598 SecurityManager security = System.getSecurityManager(); 1599 if (security != null) { 1600 security.checkPermission( 1601 SecurityConstants.GET_STACK_TRACE_PERMISSION); 1602 security.checkPermission( 1603 SecurityConstants.MODIFY_THREADGROUP_PERMISSION); 1604 } 1605 1606 // Get a snapshot of the list of all threads 1607 Thread[] threads = getThreads(); 1608 StackTraceElement[][] traces = dumpThreads(threads); 1609 Map<Thread, StackTraceElement[]> m = new HashMap<>(threads.length); 1610 for (int i = 0; i < threads.length; i++) { 1611 StackTraceElement[] stackTrace = traces[i]; 1612 if (stackTrace != null) { 1613 m.put(threads[i], stackTrace); 1614 } 1615 // else terminated so we don't put it in the map 1616 } 1617 return m; 1618 } 1619 1620 1621 private static final RuntimePermission SUBCLASS_IMPLEMENTATION_PERMISSION = 1622 new RuntimePermission("enableContextClassLoaderOverride"); 1623 1624 /** cache of subclass security audit results */ 1625 /* Replace with ConcurrentReferenceHashMap when/if it appears in a future 1626 * release */ 1627 private static class Caches { 1628 /** cache of subclass security audit results */ 1629 static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits = 1630 new ConcurrentHashMap<>(); 1631 1632 /** queue for WeakReferences to audited subclasses */ 1633 static final ReferenceQueue<Class<?>> subclassAuditsQueue = 1634 new ReferenceQueue<>(); 1635 } 1636 1637 /** 1638 * Verifies that this (possibly subclass) instance can be constructed 1639 * without violating security constraints: the subclass must not override 1640 * security-sensitive non-final methods, or else the 1641 * "enableContextClassLoaderOverride" RuntimePermission is checked. 1642 */ 1643 private static boolean isCCLOverridden(Class<?> cl) { 1644 if (cl == Thread.class) 1645 return false; 1646 1647 processQueue(Caches.subclassAuditsQueue, Caches.subclassAudits); 1648 WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue); 1649 Boolean result = Caches.subclassAudits.get(key); 1650 if (result == null) { 1651 result = Boolean.valueOf(auditSubclass(cl)); 1652 Caches.subclassAudits.putIfAbsent(key, result); 1653 } 1654 1655 return result.booleanValue(); 1656 } 1657 1658 /** 1659 * Performs reflective checks on given subclass to verify that it doesn't 1660 * override security-sensitive non-final methods. Returns true if the 1661 * subclass overrides any of the methods, false otherwise. 1662 */ 1663 private static boolean auditSubclass(final Class<?> subcl) { 1664 Boolean result = AccessController.doPrivileged( 1665 new PrivilegedAction<>() { 1666 public Boolean run() { 1667 for (Class<?> cl = subcl; 1668 cl != Thread.class; 1669 cl = cl.getSuperclass()) 1670 { 1671 try { 1672 cl.getDeclaredMethod("getContextClassLoader", new Class<?>[0]); 1673 return Boolean.TRUE; 1674 } catch (NoSuchMethodException ex) { 1675 } 1676 try { 1677 Class<?>[] params = {ClassLoader.class}; 1678 cl.getDeclaredMethod("setContextClassLoader", params); 1679 return Boolean.TRUE; 1680 } catch (NoSuchMethodException ex) { 1681 } 1682 } 1683 return Boolean.FALSE; 1684 } 1685 } 1686 ); 1687 return result.booleanValue(); 1688 } 1689 1690 private static native StackTraceElement[][] dumpThreads(Thread[] threads); 1691 private static native Thread[] getThreads(); 1692 1693 /** 1694 * Returns the identifier of this Thread. The thread ID is a positive 1695 * {@code long} number generated when this thread was created. 1696 * The thread ID is unique and remains unchanged during its lifetime. 1697 * When a thread is terminated, this thread ID may be reused. 1698 * 1699 * @return this thread's ID. 1700 * @since 1.5 1701 */ 1702 public long getId() { 1703 return tid; 1704 } 1705 1706 /** 1707 * A thread state. A thread can be in one of the following states: 1708 * <ul> 1709 * <li>{@link #NEW}<br> 1710 * A thread that has not yet started is in this state. 1711 * </li> 1712 * <li>{@link #RUNNABLE}<br> 1713 * A thread executing in the Java virtual machine is in this state. 1714 * </li> 1715 * <li>{@link #BLOCKED}<br> 1716 * A thread that is blocked waiting for a monitor lock 1717 * is in this state. 1718 * </li> 1719 * <li>{@link #WAITING}<br> 1720 * A thread that is waiting indefinitely for another thread to 1721 * perform a particular action is in this state. 1722 * </li> 1723 * <li>{@link #TIMED_WAITING}<br> 1724 * A thread that is waiting for another thread to perform an action 1725 * for up to a specified waiting time is in this state. 1726 * </li> 1727 * <li>{@link #TERMINATED}<br> 1728 * A thread that has exited is in this state. 1729 * </li> 1730 * </ul> 1731 * 1732 * <p> 1733 * A thread can be in only one state at a given point in time. 1734 * These states are virtual machine states which do not reflect 1735 * any operating system thread states. 1736 * 1737 * @since 1.5 1738 * @see #getState 1739 */ 1740 public enum State { 1741 /** 1742 * Thread state for a thread which has not yet started. 1743 */ 1744 NEW, 1745 1746 /** 1747 * Thread state for a runnable thread. A thread in the runnable 1748 * state is executing in the Java virtual machine but it may 1749 * be waiting for other resources from the operating system 1750 * such as processor. 1751 */ 1752 RUNNABLE, 1753 1754 /** 1755 * Thread state for a thread blocked waiting for a monitor lock. 1756 * A thread in the blocked state is waiting for a monitor lock 1757 * to enter a synchronized block/method or 1758 * reenter a synchronized block/method after calling 1759 * {@link Object#wait() Object.wait}. 1760 */ 1761 BLOCKED, 1762 1763 /** 1764 * Thread state for a waiting thread. 1765 * A thread is in the waiting state due to calling one of the 1766 * following methods: 1767 * <ul> 1768 * <li>{@link Object#wait() Object.wait} with no timeout</li> 1769 * <li>{@link #join() Thread.join} with no timeout</li> 1770 * <li>{@link LockSupport#park() LockSupport.park}</li> 1771 * </ul> 1772 * 1773 * <p>A thread in the waiting state is waiting for another thread to 1774 * perform a particular action. 1775 * 1776 * For example, a thread that has called {@code Object.wait()} 1777 * on an object is waiting for another thread to call 1778 * {@code Object.notify()} or {@code Object.notifyAll()} on 1779 * that object. A thread that has called {@code Thread.join()} 1780 * is waiting for a specified thread to terminate. 1781 */ 1782 WAITING, 1783 1784 /** 1785 * Thread state for a waiting thread with a specified waiting time. 1786 * A thread is in the timed waiting state due to calling one of 1787 * the following methods with a specified positive waiting time: 1788 * <ul> 1789 * <li>{@link #sleep Thread.sleep}</li> 1790 * <li>{@link Object#wait(long) Object.wait} with timeout</li> 1791 * <li>{@link #join(long) Thread.join} with timeout</li> 1792 * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li> 1793 * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li> 1794 * </ul> 1795 */ 1796 TIMED_WAITING, 1797 1798 /** 1799 * Thread state for a terminated thread. 1800 * The thread has completed execution. 1801 */ 1802 TERMINATED; 1803 } 1804 1805 /** 1806 * Returns the state of this thread. 1807 * This method is designed for use in monitoring of the system state, 1808 * not for synchronization control. 1809 * 1810 * @return this thread's state. 1811 * @since 1.5 1812 */ 1813 public State getState() { 1814 // get current thread state 1815 return sun.misc.VM.toThreadState(threadStatus); 1816 } 1817 1818 // Added in JSR-166 1819 1820 /** 1821 * Interface for handlers invoked when a {@code Thread} abruptly 1822 * terminates due to an uncaught exception. 1823 * <p>When a thread is about to terminate due to an uncaught exception 1824 * the Java Virtual Machine will query the thread for its 1825 * {@code UncaughtExceptionHandler} using 1826 * {@link #getUncaughtExceptionHandler} and will invoke the handler's 1827 * {@code uncaughtException} method, passing the thread and the 1828 * exception as arguments. 1829 * If a thread has not had its {@code UncaughtExceptionHandler} 1830 * explicitly set, then its {@code ThreadGroup} object acts as its 1831 * {@code UncaughtExceptionHandler}. If the {@code ThreadGroup} object 1832 * has no 1833 * special requirements for dealing with the exception, it can forward 1834 * the invocation to the {@linkplain #getDefaultUncaughtExceptionHandler 1835 * default uncaught exception handler}. 1836 * 1837 * @see #setDefaultUncaughtExceptionHandler 1838 * @see #setUncaughtExceptionHandler 1839 * @see ThreadGroup#uncaughtException 1840 * @since 1.5 1841 */ 1842 @FunctionalInterface 1843 public interface UncaughtExceptionHandler { 1844 /** 1845 * Method invoked when the given thread terminates due to the 1846 * given uncaught exception. 1847 * <p>Any exception thrown by this method will be ignored by the 1848 * Java Virtual Machine. 1849 * @param t the thread 1850 * @param e the exception 1851 */ 1852 void uncaughtException(Thread t, Throwable e); 1853 } 1854 1855 // null unless explicitly set 1856 private volatile UncaughtExceptionHandler uncaughtExceptionHandler; 1857 1858 // null unless explicitly set 1859 private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler; 1860 1861 /** 1862 * Set the default handler invoked when a thread abruptly terminates 1863 * due to an uncaught exception, and no other handler has been defined 1864 * for that thread. 1865 * 1866 * <p>Uncaught exception handling is controlled first by the thread, then 1867 * by the thread's {@link ThreadGroup} object and finally by the default 1868 * uncaught exception handler. If the thread does not have an explicit 1869 * uncaught exception handler set, and the thread's thread group 1870 * (including parent thread groups) does not specialize its 1871 * {@code uncaughtException} method, then the default handler's 1872 * {@code uncaughtException} method will be invoked. 1873 * <p>By setting the default uncaught exception handler, an application 1874 * can change the way in which uncaught exceptions are handled (such as 1875 * logging to a specific device, or file) for those threads that would 1876 * already accept whatever "default" behavior the system 1877 * provided. 1878 * 1879 * <p>Note that the default uncaught exception handler should not usually 1880 * defer to the thread's {@code ThreadGroup} object, as that could cause 1881 * infinite recursion. 1882 * 1883 * @param eh the object to use as the default uncaught exception handler. 1884 * If {@code null} then there is no default handler. 1885 * 1886 * @throws SecurityException if a security manager is present and it denies 1887 * {@link RuntimePermission}{@code ("setDefaultUncaughtExceptionHandler")} 1888 * 1889 * @see #setUncaughtExceptionHandler 1890 * @see #getUncaughtExceptionHandler 1891 * @see ThreadGroup#uncaughtException 1892 * @since 1.5 1893 */ 1894 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) { 1895 SecurityManager sm = System.getSecurityManager(); 1896 if (sm != null) { 1897 sm.checkPermission( 1898 new RuntimePermission("setDefaultUncaughtExceptionHandler") 1899 ); 1900 } 1901 1902 defaultUncaughtExceptionHandler = eh; 1903 } 1904 1905 /** 1906 * Returns the default handler invoked when a thread abruptly terminates 1907 * due to an uncaught exception. If the returned value is {@code null}, 1908 * there is no default. 1909 * @since 1.5 1910 * @see #setDefaultUncaughtExceptionHandler 1911 * @return the default uncaught exception handler for all threads 1912 */ 1913 public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler(){ 1914 return defaultUncaughtExceptionHandler; 1915 } 1916 1917 /** 1918 * Returns the handler invoked when this thread abruptly terminates 1919 * due to an uncaught exception. If this thread has not had an 1920 * uncaught exception handler explicitly set then this thread's 1921 * {@code ThreadGroup} object is returned, unless this thread 1922 * has terminated, in which case {@code null} is returned. 1923 * @since 1.5 1924 * @return the uncaught exception handler for this thread 1925 */ 1926 public UncaughtExceptionHandler getUncaughtExceptionHandler() { 1927 return uncaughtExceptionHandler != null ? 1928 uncaughtExceptionHandler : group; 1929 } 1930 1931 /** 1932 * Set the handler invoked when this thread abruptly terminates 1933 * due to an uncaught exception. 1934 * <p>A thread can take full control of how it responds to uncaught 1935 * exceptions by having its uncaught exception handler explicitly set. 1936 * If no such handler is set then the thread's {@code ThreadGroup} 1937 * object acts as its handler. 1938 * @param eh the object to use as this thread's uncaught exception 1939 * handler. If {@code null} then this thread has no explicit handler. 1940 * @throws SecurityException if the current thread is not allowed to 1941 * modify this thread. 1942 * @see #setDefaultUncaughtExceptionHandler 1943 * @see ThreadGroup#uncaughtException 1944 * @since 1.5 1945 */ 1946 public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) { 1947 checkAccess(); 1948 uncaughtExceptionHandler = eh; 1949 } 1950 1951 /** 1952 * Dispatch an uncaught exception to the handler. This method is 1953 * intended to be called only by the JVM. 1954 */ 1955 private void dispatchUncaughtException(Throwable e) { 1956 getUncaughtExceptionHandler().uncaughtException(this, e); 1957 } 1958 1959 /** 1960 * Removes from the specified map any keys that have been enqueued 1961 * on the specified reference queue. 1962 */ 1963 static void processQueue(ReferenceQueue<Class<?>> queue, 1964 ConcurrentMap<? extends 1965 WeakReference<Class<?>>, ?> map) 1966 { 1967 Reference<? extends Class<?>> ref; 1968 while((ref = queue.poll()) != null) { 1969 map.remove(ref); 1970 } 1971 } 1972 1973 /** 1974 * Weak key for Class objects. 1975 **/ 1976 static class WeakClassKey extends WeakReference<Class<?>> { 1977 /** 1978 * saved value of the referent's identity hash code, to maintain 1979 * a consistent hash code after the referent has been cleared 1980 */ 1981 private final int hash; 1982 1983 /** 1984 * Create a new WeakClassKey to the given object, registered 1985 * with a queue. 1986 */ 1987 WeakClassKey(Class<?> cl, ReferenceQueue<Class<?>> refQueue) { 1988 super(cl, refQueue); 1989 hash = System.identityHashCode(cl); 1990 } 1991 1992 /** 1993 * Returns the identity hash code of the original referent. 1994 */ 1995 @Override 1996 public int hashCode() { 1997 return hash; 1998 } 1999 2000 /** 2001 * Returns true if the given object is this identical 2002 * WeakClassKey instance, or, if this object's referent has not 2003 * been cleared, if the given object is another WeakClassKey 2004 * instance with the identical non-null referent as this one. 2005 */ 2006 @Override 2007 public boolean equals(Object obj) { 2008 if (obj == this) 2009 return true; 2010 2011 if (obj instanceof WeakClassKey) { 2012 Object referent = get(); 2013 return (referent != null) && 2014 (referent == ((WeakClassKey) obj).get()); 2015 } else { 2016 return false; 2017 } 2018 } 2019 } 2020 2021 2022 // The following three initially uninitialized fields are exclusively 2023 // managed by class java.util.concurrent.ThreadLocalRandom. These 2024 // fields are used to build the high-performance PRNGs in the 2025 // concurrent code, and we can not risk accidental false sharing. 2026 // Hence, the fields are isolated with @Contended. 2027 2028 /** The current seed for a ThreadLocalRandom */ 2029 @jdk.internal.vm.annotation.Contended("tlr") 2030 long threadLocalRandomSeed; 2031 2032 /** Probe hash value; nonzero if threadLocalRandomSeed initialized */ 2033 @jdk.internal.vm.annotation.Contended("tlr") 2034 int threadLocalRandomProbe; 2035 2036 /** Secondary seed isolated from public ThreadLocalRandom sequence */ 2037 @jdk.internal.vm.annotation.Contended("tlr") 2038 int threadLocalRandomSecondarySeed; 2039 2040 /* Some private helper methods */ 2041 private native void setPriority0(int newPriority); 2042 private native void stop0(Object o); 2043 private native void suspend0(); 2044 private native void resume0(); 2045 private native void interrupt0(); 2046 private native void setNativeName(String name); 2047} 2048