1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17/* 18 * Copyright (C) 2008 The Android Open Source Project 19 * 20 * Licensed under the Apache License, Version 2.0 (the "License"); 21 * you may not use this file except in compliance with the License. 22 * You may obtain a copy of the License at 23 * 24 * http://www.apache.org/licenses/LICENSE-2.0 25 * 26 * Unless required by applicable law or agreed to in writing, software 27 * distributed under the License is distributed on an "AS IS" BASIS, 28 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 29 * See the License for the specific language governing permissions and 30 * limitations under the License. 31 */ 32 33package java.lang; 34 35import dalvik.system.VMStack; 36import java.util.ArrayList; 37import java.util.HashMap; 38import java.util.List; 39import java.util.Map; 40import libcore.util.EmptyArray; 41 42/** 43 * A {@code Thread} is a concurrent unit of execution. It has its own call stack 44 * for methods being invoked, their arguments and local variables. Each virtual 45 * machine instance has at least one main {@code Thread} running when it is 46 * started; typically, there are several others for housekeeping. The 47 * application might decide to launch additional {@code Thread}s for specific 48 * purposes. 49 * <p> 50 * {@code Thread}s in the same VM interact and synchronize by the use of shared 51 * objects and monitors associated with these objects. Synchronized methods and 52 * part of the API in {@link Object} also allow {@code Thread}s to cooperate. 53 * <p> 54 * There are basically two main ways of having a {@code Thread} execute 55 * application code. One is providing a new class that extends {@code Thread} 56 * and overriding its {@link #run()} method. The other is providing a new 57 * {@code Thread} instance with a {@link Runnable} object during its creation. 58 * In both cases, the {@link #start()} method must be called to actually execute 59 * the new {@code Thread}. 60 * <p> 61 * Each {@code Thread} has an integer priority that basically determines the 62 * amount of CPU time the {@code Thread} gets. It can be set using the 63 * {@link #setPriority(int)} method. A {@code Thread} can also be made a daemon, 64 * which makes it run in the background. The latter also affects VM termination 65 * behavior: the VM does not terminate automatically as long as there are 66 * non-daemon threads running. 67 * 68 * @see java.lang.Object 69 * @see java.lang.ThreadGroup 70 * 71 */ 72public class Thread implements Runnable { 73 private static final int NANOS_PER_MILLI = 1000000; 74 75 /** Park states */ 76 private static class ParkState { 77 /** park state indicating unparked */ 78 private static final int UNPARKED = 1; 79 80 /** park state indicating preemptively unparked */ 81 private static final int PREEMPTIVELY_UNPARKED = 2; 82 83 /** park state indicating parked */ 84 private static final int PARKED = 3; 85 } 86 87 /** 88 * A representation of a thread's state. A given thread may only be in one 89 * state at a time. 90 */ 91 public enum State { 92 /** 93 * The thread has been created, but has never been started. 94 */ 95 NEW, 96 /** 97 * The thread may be run. 98 */ 99 RUNNABLE, 100 /** 101 * The thread is blocked and waiting for a lock. 102 */ 103 BLOCKED, 104 /** 105 * The thread is waiting. 106 */ 107 WAITING, 108 /** 109 * The thread is waiting for a specified amount of time. 110 */ 111 TIMED_WAITING, 112 /** 113 * The thread has been terminated. 114 */ 115 TERMINATED 116 } 117 118 /** 119 * The maximum priority value allowed for a thread. 120 */ 121 public static final int MAX_PRIORITY = 10; 122 123 /** 124 * The minimum priority value allowed for a thread. 125 */ 126 public static final int MIN_PRIORITY = 1; 127 128 /** 129 * The normal (default) priority value assigned to threads. 130 */ 131 public static final int NORM_PRIORITY = 5; 132 133 /* some of these are accessed directly by the VM; do not rename them */ 134 volatile VMThread vmThread; 135 volatile ThreadGroup group; 136 volatile boolean daemon; 137 volatile String name; 138 volatile int priority; 139 volatile long stackSize; 140 Runnable target; 141 private static int count = 0; 142 143 /** 144 * Holds the thread's ID. We simply count upwards, so 145 * each Thread has a unique ID. 146 */ 147 private long id; 148 149 /** 150 * Normal thread local values. 151 */ 152 ThreadLocal.Values localValues; 153 154 /** 155 * Inheritable thread local values. 156 */ 157 ThreadLocal.Values inheritableValues; 158 159 /** Callbacks to run on interruption. */ 160 private final List<Runnable> interruptActions = new ArrayList<Runnable>(); 161 162 /** 163 * Holds the class loader for this Thread, in case there is one. 164 */ 165 private ClassLoader contextClassLoader; 166 167 /** 168 * Holds the handler for uncaught exceptions in this Thread, 169 * in case there is one. 170 */ 171 private UncaughtExceptionHandler uncaughtHandler; 172 173 /** 174 * Holds the default handler for uncaught exceptions, in case there is one. 175 */ 176 private static UncaughtExceptionHandler defaultUncaughtHandler; 177 178 /** 179 * Reflects whether this Thread has already been started. A Thread 180 * can only be started once (no recycling). Also, we need it to deduce 181 * the proper Thread status. 182 */ 183 boolean hasBeenStarted = false; 184 185 /** the park state of the thread */ 186 private int parkState = ParkState.UNPARKED; 187 188 /** The synchronization object responsible for this thread parking. */ 189 private Object parkBlocker; 190 191 /** 192 * Constructs a new {@code Thread} with no {@code Runnable} object and a 193 * newly generated name. The new {@code Thread} will belong to the same 194 * {@code ThreadGroup} as the {@code Thread} calling this constructor. 195 * 196 * @see java.lang.ThreadGroup 197 * @see java.lang.Runnable 198 */ 199 public Thread() { 200 create(null, null, null, 0); 201 } 202 203 /** 204 * Constructs a new {@code Thread} with a {@code Runnable} object and a 205 * newly generated name. The new {@code Thread} will belong to the same 206 * {@code ThreadGroup} as the {@code Thread} calling this constructor. 207 * 208 * @param runnable 209 * a {@code Runnable} whose method <code>run</code> will be 210 * executed by the new {@code Thread} 211 * 212 * @see java.lang.ThreadGroup 213 * @see java.lang.Runnable 214 */ 215 public Thread(Runnable runnable) { 216 create(null, runnable, null, 0); 217 } 218 219 /** 220 * Constructs a new {@code Thread} with a {@code Runnable} object and name 221 * provided. The new {@code Thread} will belong to the same {@code 222 * ThreadGroup} as the {@code Thread} calling this constructor. 223 * 224 * @param runnable 225 * a {@code Runnable} whose method <code>run</code> will be 226 * executed by the new {@code Thread} 227 * @param threadName 228 * the name for the {@code Thread} being created 229 * 230 * @see java.lang.ThreadGroup 231 * @see java.lang.Runnable 232 */ 233 public Thread(Runnable runnable, String threadName) { 234 if (threadName == null) { 235 throw new NullPointerException("threadName == null"); 236 } 237 238 create(null, runnable, threadName, 0); 239 } 240 241 /** 242 * Constructs a new {@code Thread} with no {@code Runnable} object and the 243 * name provided. The new {@code Thread} will belong to the same {@code 244 * ThreadGroup} as the {@code Thread} calling this constructor. 245 * 246 * @param threadName 247 * the name for the {@code Thread} being created 248 * 249 * @see java.lang.ThreadGroup 250 * @see java.lang.Runnable 251 * 252 */ 253 public Thread(String threadName) { 254 if (threadName == null) { 255 throw new NullPointerException("threadName == null"); 256 } 257 258 create(null, null, threadName, 0); 259 } 260 261 /** 262 * Constructs a new {@code Thread} with a {@code Runnable} object and a 263 * newly generated name. The new {@code Thread} will belong to the {@code 264 * ThreadGroup} passed as parameter. 265 * 266 * @param group 267 * {@code ThreadGroup} to which the new {@code Thread} will 268 * belong 269 * @param runnable 270 * a {@code Runnable} whose method <code>run</code> will be 271 * executed by the new {@code Thread} 272 * @throws IllegalThreadStateException 273 * if <code>group.destroy()</code> has already been done 274 * @see java.lang.ThreadGroup 275 * @see java.lang.Runnable 276 */ 277 public Thread(ThreadGroup group, Runnable runnable) { 278 create(group, runnable, null, 0); 279 } 280 281 /** 282 * Constructs a new {@code Thread} with a {@code Runnable} object, the given 283 * name and belonging to the {@code ThreadGroup} passed as parameter. 284 * 285 * @param group 286 * ThreadGroup to which the new {@code Thread} will belong 287 * @param runnable 288 * a {@code Runnable} whose method <code>run</code> will be 289 * executed by the new {@code Thread} 290 * @param threadName 291 * the name for the {@code Thread} being created 292 * @throws IllegalThreadStateException 293 * if <code>group.destroy()</code> has already been done 294 * @see java.lang.ThreadGroup 295 * @see java.lang.Runnable 296 */ 297 public Thread(ThreadGroup group, Runnable runnable, String threadName) { 298 if (threadName == null) { 299 throw new NullPointerException("threadName == null"); 300 } 301 302 create(group, runnable, threadName, 0); 303 } 304 305 /** 306 * Constructs a new {@code Thread} with no {@code Runnable} object, the 307 * given name and belonging to the {@code ThreadGroup} passed as parameter. 308 * 309 * @param group 310 * {@code ThreadGroup} to which the new {@code Thread} will belong 311 * @param threadName 312 * the name for the {@code Thread} being created 313 * @throws IllegalThreadStateException 314 * if <code>group.destroy()</code> has already been done 315 * @see java.lang.ThreadGroup 316 * @see java.lang.Runnable 317 */ 318 public Thread(ThreadGroup group, String threadName) { 319 if (threadName == null) { 320 throw new NullPointerException("threadName == null"); 321 } 322 323 create(group, null, threadName, 0); 324 } 325 326 /** 327 * Constructs a new {@code Thread} with a {@code Runnable} object, the given 328 * name and belonging to the {@code ThreadGroup} passed as parameter. 329 * 330 * @param group 331 * {@code ThreadGroup} to which the new {@code Thread} will 332 * belong 333 * @param runnable 334 * a {@code Runnable} whose method <code>run</code> will be 335 * executed by the new {@code Thread} 336 * @param threadName 337 * the name for the {@code Thread} being created 338 * @param stackSize 339 * a stack size for the new {@code Thread}. This has a highly 340 * platform-dependent interpretation. It may even be ignored 341 * completely. 342 * @throws IllegalThreadStateException 343 * if <code>group.destroy()</code> has already been done 344 * @see java.lang.ThreadGroup 345 * @see java.lang.Runnable 346 */ 347 public Thread(ThreadGroup group, Runnable runnable, String threadName, long stackSize) { 348 if (threadName == null) { 349 throw new NullPointerException("threadName == null"); 350 } 351 create(group, runnable, threadName, stackSize); 352 } 353 354 /** 355 * Package-scope method invoked by Dalvik VM to create "internal" 356 * threads or attach threads created externally. 357 * 358 * Don't call Thread.currentThread(), since there may not be such 359 * a thing (e.g. for Main). 360 */ 361 Thread(ThreadGroup group, String name, int priority, boolean daemon) { 362 synchronized (Thread.class) { 363 id = ++Thread.count; 364 } 365 366 if (name == null) { 367 this.name = "Thread-" + id; 368 } else { 369 this.name = name; 370 } 371 372 if (group == null) { 373 throw new InternalError("group not specified"); 374 } 375 376 this.group = group; 377 378 this.target = null; 379 this.stackSize = 0; 380 this.priority = priority; 381 this.daemon = daemon; 382 383 /* add ourselves to our ThreadGroup of choice */ 384 this.group.addThread(this); 385 } 386 387 /** 388 * Initializes a new, existing Thread object with a runnable object, 389 * the given name and belonging to the ThreadGroup passed as parameter. 390 * This is the method that the several public constructors delegate their 391 * work to. 392 * 393 * @param group ThreadGroup to which the new Thread will belong 394 * @param runnable a java.lang.Runnable whose method <code>run</code> will 395 * be executed by the new Thread 396 * @param threadName Name for the Thread being created 397 * @param stackSize Platform dependent stack size 398 * @throws IllegalThreadStateException if <code>group.destroy()</code> has 399 * already been done 400 * @see java.lang.ThreadGroup 401 * @see java.lang.Runnable 402 */ 403 private void create(ThreadGroup group, Runnable runnable, String threadName, long stackSize) { 404 Thread currentThread = Thread.currentThread(); 405 if (group == null) { 406 group = currentThread.getThreadGroup(); 407 } 408 409 if (group.isDestroyed()) { 410 throw new IllegalThreadStateException("Group already destroyed"); 411 } 412 413 this.group = group; 414 415 synchronized (Thread.class) { 416 id = ++Thread.count; 417 } 418 419 if (threadName == null) { 420 this.name = "Thread-" + id; 421 } else { 422 this.name = threadName; 423 } 424 425 this.target = runnable; 426 this.stackSize = stackSize; 427 428 this.priority = currentThread.getPriority(); 429 430 this.contextClassLoader = currentThread.contextClassLoader; 431 432 // Transfer over InheritableThreadLocals. 433 if (currentThread.inheritableValues != null) { 434 inheritableValues = new ThreadLocal.Values(currentThread.inheritableValues); 435 } 436 437 // add ourselves to our ThreadGroup of choice 438 this.group.addThread(this); 439 } 440 441 /** 442 * Returns the number of active {@code Thread}s in the running {@code 443 * Thread}'s group and its subgroups. 444 * 445 * @return the number of {@code Thread}s 446 */ 447 public static int activeCount() { 448 return currentThread().getThreadGroup().activeCount(); 449 } 450 451 /** 452 * Does nothing. 453 */ 454 public final void checkAccess() { 455 } 456 457 /** 458 * Returns the number of stack frames in this thread. 459 * 460 * @return Number of stack frames 461 * @deprecated The results of this call were never well defined. To make 462 * things worse, it would depend on whether the Thread was 463 * suspended or not, and suspend was deprecated too. 464 */ 465 @Deprecated 466 public int countStackFrames() { 467 return getStackTrace().length; 468 } 469 470 /** 471 * Returns the Thread of the caller, that is, the current Thread. 472 * 473 * @return the current Thread. 474 */ 475 public static Thread currentThread() { 476 return VMThread.currentThread(); 477 } 478 479 /** 480 * Destroys the receiver without any monitor cleanup. 481 * 482 * @deprecated Not implemented. 483 */ 484 @Deprecated 485 public void destroy() { 486 throw new NoSuchMethodError("Thread.destroy()"); // TODO Externalize??? 487 } 488 489 /** 490 * Prints to the standard error stream a text representation of the current 491 * stack for this Thread. 492 * 493 * @see Throwable#printStackTrace() 494 */ 495 public static void dumpStack() { 496 new Throwable("stack dump").printStackTrace(); 497 } 498 499 /** 500 * Copies an array with all Threads which are in the same ThreadGroup as the 501 * receiver - and subgroups - into the array <code>threads</code> passed as 502 * parameter. If the array passed as parameter is too small no exception is 503 * thrown - the extra elements are simply not copied. 504 * 505 * @param threads 506 * array into which the Threads will be copied 507 * @return How many Threads were copied over 508 */ 509 public static int enumerate(Thread[] threads) { 510 Thread thread = Thread.currentThread(); 511 return thread.getThreadGroup().enumerate(threads); 512 } 513 514 /** 515 * Returns a map of all the currently live threads to their stack traces. 516 */ 517 public static Map<Thread, StackTraceElement[]> getAllStackTraces() { 518 Map<Thread, StackTraceElement[]> map = new HashMap<Thread, StackTraceElement[]>(); 519 520 // Find out how many live threads we have. Allocate a bit more 521 // space than needed, in case new ones are just being created. 522 int count = ThreadGroup.mSystem.activeCount(); 523 Thread[] threads = new Thread[count + count / 2]; 524 525 // Enumerate the threads and collect the stacktraces. 526 count = ThreadGroup.mSystem.enumerate(threads); 527 for (int i = 0; i < count; i++) { 528 map.put(threads[i], threads[i].getStackTrace()); 529 } 530 531 return map; 532 } 533 534 /** 535 * Returns the context ClassLoader for this Thread. 536 * 537 * @return ClassLoader The context ClassLoader 538 * @see java.lang.ClassLoader 539 * @see #getContextClassLoader() 540 */ 541 public ClassLoader getContextClassLoader() { 542 return contextClassLoader; 543 } 544 545 /** 546 * Returns the default exception handler that's executed when uncaught 547 * exception terminates a thread. 548 * 549 * @return an {@link UncaughtExceptionHandler} or <code>null</code> if 550 * none exists. 551 */ 552 public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() { 553 return defaultUncaughtHandler; 554 } 555 556 /** 557 * Returns the thread's identifier. The ID is a positive <code>long</code> 558 * generated on thread creation, is unique to the thread, and doesn't change 559 * during the lifetime of the thread; the ID may be reused after the thread 560 * has been terminated. 561 * 562 * @return the thread's ID. 563 */ 564 public long getId() { 565 return id; 566 } 567 568 /** 569 * Returns the name of the Thread. 570 * 571 * @return the Thread's name 572 */ 573 public final String getName() { 574 return name; 575 } 576 577 /** 578 * Returns the priority of the Thread. 579 * 580 * @return the Thread's priority 581 * @see Thread#setPriority 582 */ 583 public final int getPriority() { 584 return priority; 585 } 586 587 /** 588 * Returns an array of {@link StackTraceElement} representing the current thread's stack. 589 */ 590 public StackTraceElement[] getStackTrace() { 591 StackTraceElement ste[] = VMStack.getThreadStackTrace(this); 592 return ste != null ? ste : EmptyArray.STACK_TRACE_ELEMENT; 593 } 594 595 /** 596 * Returns the current state of the Thread. This method is useful for 597 * monitoring purposes. 598 * 599 * @return a {@link State} value. 600 */ 601 public State getState() { 602 // TODO This is ugly and should be implemented better. 603 VMThread vmt = this.vmThread; 604 605 // Make sure we have a valid reference to an object. If native code 606 // deletes the reference we won't run into a null reference later. 607 VMThread thread = vmThread; 608 if (thread != null) { 609 // If the Thread Object became invalid or was not yet started, 610 // getStatus() will return -1. 611 int state = thread.getStatus(); 612 if(state != -1) { 613 return VMThread.STATE_MAP[state]; 614 } 615 } 616 return hasBeenStarted ? Thread.State.TERMINATED : Thread.State.NEW; 617 } 618 619 /** 620 * Returns the ThreadGroup to which this Thread belongs. 621 * 622 * @return the Thread's ThreadGroup 623 */ 624 public final ThreadGroup getThreadGroup() { 625 // TODO This should actually be done at native termination. 626 if (getState() == Thread.State.TERMINATED) { 627 return null; 628 } else { 629 return group; 630 } 631 } 632 633 /** 634 * Returns the thread's uncaught exception handler. If not explicitly set, 635 * then the ThreadGroup's handler is returned. If the thread is terminated, 636 * then <code>null</code> is returned. 637 * 638 * @return an {@link UncaughtExceptionHandler} instance or {@code null}. 639 */ 640 public UncaughtExceptionHandler getUncaughtExceptionHandler() { 641 if (uncaughtHandler != null) 642 return uncaughtHandler; 643 else 644 return group; // ThreadGroup is instance of UEH 645 } 646 647 /** 648 * Posts an interrupt request to this {@code Thread}. The behavior depends on 649 * the state of this {@code Thread}: 650 * <ul> 651 * <li> 652 * {@code Thread}s blocked in one of {@code Object}'s {@code wait()} methods 653 * or one of {@code Thread}'s {@code join()} or {@code sleep()} methods will 654 * be woken up, their interrupt status will be cleared, and they receive an 655 * {@link InterruptedException}. 656 * <li> 657 * {@code Thread}s blocked in an I/O operation of an 658 * {@link java.nio.channels.InterruptibleChannel} will have their interrupt 659 * status set and receive an 660 * {@link java.nio.channels.ClosedByInterruptException}. Also, the channel 661 * will be closed. 662 * <li> 663 * {@code Thread}s blocked in a {@link java.nio.channels.Selector} will have 664 * their interrupt status set and return immediately. They don't receive an 665 * exception in this case. 666 * <ul> 667 * 668 * @see Thread#interrupted 669 * @see Thread#isInterrupted 670 */ 671 public void interrupt() { 672 synchronized (interruptActions) { 673 for (int i = interruptActions.size() - 1; i >= 0; i--) { 674 interruptActions.get(i).run(); 675 } 676 } 677 678 VMThread vmt = this.vmThread; 679 if (vmt != null) { 680 vmt.interrupt(); 681 } 682 } 683 684 /** 685 * Returns a <code>boolean</code> indicating whether the current Thread ( 686 * <code>currentThread()</code>) has a pending interrupt request (<code> 687 * true</code>) or not (<code>false</code>). It also has the side-effect of 688 * clearing the flag. 689 * 690 * @return a <code>boolean</code> indicating the interrupt status 691 * @see Thread#currentThread 692 * @see Thread#interrupt 693 * @see Thread#isInterrupted 694 */ 695 public static boolean interrupted() { 696 return VMThread.interrupted(); 697 } 698 699 /** 700 * Returns <code>true</code> if the receiver has already been started and 701 * still runs code (hasn't died yet). Returns <code>false</code> either if 702 * the receiver hasn't been started yet or if it has already started and run 703 * to completion and died. 704 * 705 * @return a <code>boolean</code> indicating the liveness of the Thread 706 * @see Thread#start 707 */ 708 public final boolean isAlive() { 709 return (vmThread != null); 710 } 711 712 /** 713 * Returns a <code>boolean</code> indicating whether the receiver is a 714 * daemon Thread (<code>true</code>) or not (<code>false</code>) A 715 * daemon Thread only runs as long as there are non-daemon Threads running. 716 * When the last non-daemon Thread ends, the whole program ends no matter if 717 * it had daemon Threads still running or not. 718 * 719 * @return a <code>boolean</code> indicating whether the Thread is a daemon 720 * @see Thread#setDaemon 721 */ 722 public final boolean isDaemon() { 723 return daemon; 724 } 725 726 /** 727 * Returns a <code>boolean</code> indicating whether the receiver has a 728 * pending interrupt request (<code>true</code>) or not ( 729 * <code>false</code>) 730 * 731 * @return a <code>boolean</code> indicating the interrupt status 732 * @see Thread#interrupt 733 * @see Thread#interrupted 734 */ 735 public boolean isInterrupted() { 736 VMThread vmt = this.vmThread; 737 if (vmt != null) { 738 return vmt.isInterrupted(); 739 } 740 741 return false; 742 } 743 744 /** 745 * Blocks the current Thread (<code>Thread.currentThread()</code>) until 746 * the receiver finishes its execution and dies. 747 * 748 * @throws InterruptedException if <code>interrupt()</code> was called for 749 * the receiver while it was in the <code>join()</code> call 750 * @see Object#notifyAll 751 * @see java.lang.ThreadDeath 752 */ 753 public final void join() throws InterruptedException { 754 VMThread t = vmThread; 755 if (t == null) { 756 return; 757 } 758 759 synchronized (t) { 760 while (isAlive()) { 761 t.wait(); 762 } 763 } 764 } 765 766 /** 767 * Blocks the current Thread (<code>Thread.currentThread()</code>) until 768 * the receiver finishes its execution and dies or the specified timeout 769 * expires, whatever happens first. 770 * 771 * @param millis The maximum time to wait (in milliseconds). 772 * @throws InterruptedException if <code>interrupt()</code> was called for 773 * the receiver while it was in the <code>join()</code> call 774 * @see Object#notifyAll 775 * @see java.lang.ThreadDeath 776 */ 777 public final void join(long millis) throws InterruptedException { 778 join(millis, 0); 779 } 780 781 /** 782 * Blocks the current Thread (<code>Thread.currentThread()</code>) until 783 * the receiver finishes its execution and dies or the specified timeout 784 * expires, whatever happens first. 785 * 786 * @param millis The maximum time to wait (in milliseconds). 787 * @param nanos Extra nanosecond precision 788 * @throws InterruptedException if <code>interrupt()</code> was called for 789 * the receiver while it was in the <code>join()</code> call 790 * @see Object#notifyAll 791 * @see java.lang.ThreadDeath 792 */ 793 public final void join(long millis, int nanos) throws InterruptedException { 794 if (millis < 0 || nanos < 0 || nanos >= NANOS_PER_MILLI) { 795 throw new IllegalArgumentException(); 796 } 797 798 // avoid overflow: if total > 292,277 years, just wait forever 799 boolean overflow = millis >= (Long.MAX_VALUE - nanos) / NANOS_PER_MILLI; 800 boolean forever = (millis | nanos) == 0; 801 if (forever | overflow) { 802 join(); 803 return; 804 } 805 806 VMThread t = vmThread; 807 if (t == null) { 808 return; 809 } 810 811 synchronized (t) { 812 if (!isAlive()) { 813 return; 814 } 815 816 // guaranteed not to overflow 817 long nanosToWait = millis * NANOS_PER_MILLI + nanos; 818 819 // wait until this thread completes or the timeout has elapsed 820 long start = System.nanoTime(); 821 while (true) { 822 t.wait(millis, nanos); 823 if (!isAlive()) { 824 break; 825 } 826 long nanosElapsed = System.nanoTime() - start; 827 long nanosRemaining = nanosToWait - nanosElapsed; 828 if (nanosRemaining <= 0) { 829 break; 830 } 831 millis = nanosRemaining / NANOS_PER_MILLI; 832 nanos = (int) (nanosRemaining - millis * NANOS_PER_MILLI); 833 } 834 } 835 } 836 837 /** 838 * Throws {@code UnsupportedOperationException}. 839 * 840 * @see Thread#suspend() 841 * @deprecated Used with deprecated method {@link Thread#suspend} 842 */ 843 @Deprecated 844 public final void resume() { 845 throw new UnsupportedOperationException(); 846 } 847 848 /** 849 * Calls the <code>run()</code> method of the Runnable object the receiver 850 * holds. If no Runnable is set, does nothing. 851 * 852 * @see Thread#start 853 */ 854 public void run() { 855 if (target != null) { 856 target.run(); 857 } 858 } 859 860 /** 861 * Set the context ClassLoader for the receiver. 862 * 863 * @param cl The context ClassLoader 864 * @see #getContextClassLoader() 865 */ 866 public void setContextClassLoader(ClassLoader cl) { 867 contextClassLoader = cl; 868 } 869 870 /** 871 * Set if the receiver is a daemon Thread or not. This can only be done 872 * before the Thread starts running. 873 * 874 * @param isDaemon 875 * indicates whether the Thread should be daemon or not 876 * @see Thread#isDaemon 877 */ 878 public final void setDaemon(boolean isDaemon) { 879 if (hasBeenStarted) { 880 throw new IllegalThreadStateException("Thread already started."); // TODO Externalize? 881 } 882 883 if (vmThread == null) { 884 daemon = isDaemon; 885 } 886 } 887 888 /** 889 * Sets the default uncaught exception handler. This handler is invoked in 890 * case any Thread dies due to an unhandled exception. 891 * 892 * @param handler 893 * The handler to set or null. 894 */ 895 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) { 896 Thread.defaultUncaughtHandler = handler; 897 } 898 899 /** 900 * Adds a runnable to be invoked upon interruption. If this thread has 901 * already been interrupted, the runnable will be invoked immediately. The 902 * action should be idempotent as it may be invoked multiple times for a 903 * single interruption. 904 * 905 * <p>Each call to this method must be matched with a corresponding call to 906 * {@link #popInterruptAction$}. 907 * 908 * @hide used by NIO 909 */ 910 public final void pushInterruptAction$(Runnable interruptAction) { 911 synchronized (interruptActions) { 912 interruptActions.add(interruptAction); 913 } 914 915 if (interruptAction != null && isInterrupted()) { 916 interruptAction.run(); 917 } 918 } 919 920 /** 921 * Removes {@code interruptAction} so it is not invoked upon interruption. 922 * 923 * @param interruptAction the pushed action, used to check that the call 924 * stack is correctly nested. 925 * 926 * @hide used by NIO 927 */ 928 public final void popInterruptAction$(Runnable interruptAction) { 929 synchronized (interruptActions) { 930 Runnable removed = interruptActions.remove(interruptActions.size() - 1); 931 if (interruptAction != removed) { 932 throw new IllegalArgumentException( 933 "Expected " + interruptAction + " but was " + removed); 934 } 935 } 936 } 937 938 /** 939 * Sets the name of the Thread. 940 * 941 * @param threadName the new name for the Thread 942 * @see Thread#getName 943 */ 944 public final void setName(String threadName) { 945 if (threadName == null) { 946 throw new NullPointerException("threadName == null"); 947 } 948 949 name = threadName; 950 VMThread vmt = this.vmThread; 951 if (vmt != null) { 952 /* notify the VM that the thread name has changed */ 953 vmt.nameChanged(threadName); 954 } 955 } 956 957 /** 958 * Sets the priority of the Thread. Note that the final priority set may not 959 * be the parameter that was passed - it will depend on the receiver's 960 * ThreadGroup. The priority cannot be set to be higher than the receiver's 961 * ThreadGroup's maxPriority(). 962 * 963 * @param priority 964 * new priority for the Thread 965 * @throws IllegalArgumentException 966 * if the new priority is greater than Thread.MAX_PRIORITY or 967 * less than Thread.MIN_PRIORITY 968 * @see Thread#getPriority 969 */ 970 public final void setPriority(int priority) { 971 if (priority < Thread.MIN_PRIORITY || priority > Thread.MAX_PRIORITY) { 972 throw new IllegalArgumentException("Priority out of range"); // TODO Externalize? 973 } 974 975 if (priority > group.getMaxPriority()) { 976 priority = group.getMaxPriority(); 977 } 978 979 this.priority = priority; 980 981 VMThread vmt = this.vmThread; 982 if (vmt != null) { 983 vmt.setPriority(priority); 984 } 985 } 986 987 /** 988 * <p> 989 * Sets the uncaught exception handler. This handler is invoked in case this 990 * Thread dies due to an unhandled exception. 991 * </p> 992 * 993 * @param handler 994 * The handler to set or <code>null</code>. 995 */ 996 public void setUncaughtExceptionHandler(UncaughtExceptionHandler handler) { 997 uncaughtHandler = handler; 998 } 999 1000 /** 1001 * Causes the thread which sent this message to sleep for the given interval 1002 * of time (given in milliseconds). The precision is not guaranteed - the 1003 * Thread may sleep more or less than requested. 1004 * 1005 * @param time 1006 * The time to sleep in milliseconds. 1007 * @throws InterruptedException 1008 * if <code>interrupt()</code> was called for this Thread while 1009 * it was sleeping 1010 * @see Thread#interrupt() 1011 */ 1012 public static void sleep(long time) throws InterruptedException { 1013 Thread.sleep(time, 0); 1014 } 1015 1016 /** 1017 * Causes the thread which sent this message to sleep for the given interval 1018 * of time (given in milliseconds and nanoseconds). The precision is not 1019 * guaranteed - the Thread may sleep more or less than requested. 1020 * 1021 * @param millis 1022 * The time to sleep in milliseconds. 1023 * @param nanos 1024 * Extra nanosecond precision 1025 * @throws InterruptedException 1026 * if <code>interrupt()</code> was called for this Thread while 1027 * it was sleeping 1028 * @see Thread#interrupt() 1029 */ 1030 public static void sleep(long millis, int nanos) throws InterruptedException { 1031 VMThread.sleep(millis, nanos); 1032 } 1033 1034 /** 1035 * Starts the new Thread of execution. The <code>run()</code> method of 1036 * the receiver will be called by the receiver Thread itself (and not the 1037 * Thread calling <code>start()</code>). 1038 * 1039 * @throws IllegalThreadStateException if the Thread has been started before 1040 * 1041 * @see Thread#run 1042 */ 1043 public synchronized void start() { 1044 if (hasBeenStarted) { 1045 throw new IllegalThreadStateException("Thread already started."); // TODO Externalize? 1046 } 1047 1048 hasBeenStarted = true; 1049 1050 VMThread.create(this, stackSize); 1051 } 1052 1053 /** 1054 * Requests the receiver Thread to stop and throw ThreadDeath. The Thread is 1055 * resumed if it was suspended and awakened if it was sleeping, so that it 1056 * can proceed to throw ThreadDeath. 1057 * 1058 * @deprecated because stopping a thread in this manner is unsafe and can 1059 * leave your application and the VM in an unpredictable state. 1060 */ 1061 @Deprecated 1062 public final void stop() { 1063 stop(new ThreadDeath()); 1064 } 1065 1066 /** 1067 * Throws {@code UnsupportedOperationException}. 1068 * 1069 * @throws NullPointerException if <code>throwable()</code> is 1070 * <code>null</code> 1071 * @deprecated because stopping a thread in this manner is unsafe and can 1072 * leave your application and the VM in an unpredictable state. 1073 */ 1074 @Deprecated 1075 public final synchronized void stop(Throwable throwable) { 1076 throw new UnsupportedOperationException(); 1077 } 1078 1079 /** 1080 * Throws {@code UnsupportedOperationException}. 1081 * 1082 * @see Thread#resume() 1083 * @deprecated May cause deadlocks. 1084 */ 1085 @Deprecated 1086 public final void suspend() { 1087 throw new UnsupportedOperationException(); 1088 } 1089 1090 /** 1091 * Returns a string containing a concise, human-readable description of the 1092 * Thread. It includes the Thread's name, priority, and group name. 1093 * 1094 * @return a printable representation for the receiver. 1095 */ 1096 @Override 1097 public String toString() { 1098 return "Thread[" + name + "," + priority + "," + group.getName() + "]"; 1099 } 1100 1101 /** 1102 * Causes the calling Thread to yield execution time to another Thread that 1103 * is ready to run. The actual scheduling is implementation-dependent. 1104 */ 1105 public static void yield() { 1106 VMThread.yield(); 1107 } 1108 1109 /** 1110 * Indicates whether the current Thread has a monitor lock on the specified 1111 * object. 1112 * 1113 * @param object the object to test for the monitor lock 1114 * @return true if the current thread has a monitor lock on the specified 1115 * object; false otherwise 1116 */ 1117 public static boolean holdsLock(Object object) { 1118 return currentThread().vmThread.holdsLock(object); 1119 } 1120 1121 /** 1122 * Implemented by objects that want to handle cases where a thread is being 1123 * terminated by an uncaught exception. Upon such termination, the handler 1124 * is notified of the terminating thread and causal exception. If there is 1125 * no explicit handler set then the thread's group is the default handler. 1126 */ 1127 public static interface UncaughtExceptionHandler { 1128 /** 1129 * The thread is being terminated by an uncaught exception. Further 1130 * exceptions thrown in this method are prevent the remainder of the 1131 * method from executing, but are otherwise ignored. 1132 * 1133 * @param thread the thread that has an uncaught exception 1134 * @param ex the exception that was thrown 1135 */ 1136 void uncaughtException(Thread thread, Throwable ex); 1137 } 1138 1139 /** 1140 * Unparks this thread. This unblocks the thread it if it was 1141 * previously parked, or indicates that the thread is "preemptively 1142 * unparked" if it wasn't already parked. The latter means that the 1143 * next time the thread is told to park, it will merely clear its 1144 * latent park bit and carry on without blocking. 1145 * 1146 * <p>See {@link java.util.concurrent.locks.LockSupport} for more 1147 * in-depth information of the behavior of this method.</p> 1148 * 1149 * @hide for Unsafe 1150 */ 1151 public void unpark() { 1152 VMThread vmt = vmThread; 1153 1154 if (vmt == null) { 1155 /* 1156 * vmThread is null before the thread is start()ed. In 1157 * this case, we just go ahead and set the state to 1158 * PREEMPTIVELY_UNPARKED. Since this happens before the 1159 * thread is started, we don't have to worry about 1160 * synchronizing with it. 1161 */ 1162 parkState = ParkState.PREEMPTIVELY_UNPARKED; 1163 return; 1164 } 1165 1166 synchronized (vmt) { 1167 switch (parkState) { 1168 case ParkState.PREEMPTIVELY_UNPARKED: { 1169 /* 1170 * Nothing to do in this case: By definition, a 1171 * preemptively unparked thread is to remain in 1172 * the preemptively unparked state if it is told 1173 * to unpark. 1174 */ 1175 break; 1176 } 1177 case ParkState.UNPARKED: { 1178 parkState = ParkState.PREEMPTIVELY_UNPARKED; 1179 break; 1180 } 1181 default /*parked*/: { 1182 parkState = ParkState.UNPARKED; 1183 vmt.notifyAll(); 1184 break; 1185 } 1186 } 1187 } 1188 } 1189 1190 /** 1191 * Parks the current thread for a particular number of nanoseconds, or 1192 * indefinitely. If not indefinitely, this method unparks the thread 1193 * after the given number of nanoseconds if no other thread unparks it 1194 * first. If the thread has been "preemptively unparked," this method 1195 * cancels that unparking and returns immediately. This method may 1196 * also return spuriously (that is, without the thread being told to 1197 * unpark and without the indicated amount of time elapsing). 1198 * 1199 * <p>See {@link java.util.concurrent.locks.LockSupport} for more 1200 * in-depth information of the behavior of this method.</p> 1201 * 1202 * <p>This method must only be called when <code>this</code> is the current 1203 * thread. 1204 * 1205 * @param nanos number of nanoseconds to park for or <code>0</code> 1206 * to park indefinitely 1207 * @throws IllegalArgumentException thrown if <code>nanos < 0</code> 1208 * 1209 * @hide for Unsafe 1210 */ 1211 public void parkFor(long nanos) { 1212 VMThread vmt = vmThread; 1213 1214 if (vmt == null) { 1215 // Running threads should always have an associated vmThread. 1216 throw new AssertionError(); 1217 } 1218 1219 synchronized (vmt) { 1220 switch (parkState) { 1221 case ParkState.PREEMPTIVELY_UNPARKED: { 1222 parkState = ParkState.UNPARKED; 1223 break; 1224 } 1225 case ParkState.UNPARKED: { 1226 long millis = nanos / NANOS_PER_MILLI; 1227 nanos %= NANOS_PER_MILLI; 1228 1229 parkState = ParkState.PARKED; 1230 try { 1231 vmt.wait(millis, (int) nanos); 1232 } catch (InterruptedException ex) { 1233 interrupt(); 1234 } finally { 1235 /* 1236 * Note: If parkState manages to become 1237 * PREEMPTIVELY_UNPARKED before hitting this 1238 * code, it should left in that state. 1239 */ 1240 if (parkState == ParkState.PARKED) { 1241 parkState = ParkState.UNPARKED; 1242 } 1243 } 1244 break; 1245 } 1246 default /*parked*/: { 1247 throw new AssertionError( 1248 "shouldn't happen: attempt to repark"); 1249 } 1250 } 1251 } 1252 } 1253 1254 /** 1255 * Parks the current thread until the specified system time. This 1256 * method attempts to unpark the current thread immediately after 1257 * <code>System.currentTimeMillis()</code> reaches the specified 1258 * value, if no other thread unparks it first. If the thread has 1259 * been "preemptively unparked," this method cancels that 1260 * unparking and returns immediately. This method may also return 1261 * spuriously (that is, without the thread being told to unpark 1262 * and without the indicated amount of time elapsing). 1263 * 1264 * <p>See {@link java.util.concurrent.locks.LockSupport} for more 1265 * in-depth information of the behavior of this method.</p> 1266 * 1267 * <p>This method must only be called when <code>this</code> is the 1268 * current thread. 1269 * 1270 * @param time the time after which the thread should be unparked, 1271 * in absolute milliseconds-since-the-epoch 1272 * 1273 * @hide for Unsafe 1274 */ 1275 public void parkUntil(long time) { 1276 VMThread vmt = vmThread; 1277 1278 if (vmt == null) { 1279 // Running threads should always have an associated vmThread. 1280 throw new AssertionError(); 1281 } 1282 1283 synchronized (vmt) { 1284 /* 1285 * Note: This conflates the two time bases of "wall clock" 1286 * time and "monotonic uptime" time. However, given that 1287 * the underlying system can only wait on monotonic time, 1288 * it is unclear if there is any way to avoid the 1289 * conflation. The downside here is that if, having 1290 * calculated the delay, the wall clock gets moved ahead, 1291 * this method may not return until well after the wall 1292 * clock has reached the originally designated time. The 1293 * reverse problem (the wall clock being turned back) 1294 * isn't a big deal, since this method is allowed to 1295 * spuriously return for any reason, and this situation 1296 * can safely be construed as just such a spurious return. 1297 */ 1298 long delayMillis = time - System.currentTimeMillis(); 1299 1300 if (delayMillis <= 0) { 1301 parkState = ParkState.UNPARKED; 1302 } else { 1303 parkFor(delayMillis * NANOS_PER_MILLI); 1304 } 1305 } 1306 } 1307} 1308