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