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 &lt; 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