java多线程并发控制之ThreadLocal

下面是ThreadLocal的测试代码,更多信息请参考注释


  1. package com.jadyer.thread.local;  
  2.   
  3. import java.util.Random;  
  4.   
  5. /** 
  6.  * ThreadLocal Test 
  7.  * @see ============================================================================================================= 
  8.  * @see ThreadLocal的作用和目的 
  9.  * @see ThreadLocal用于实现线程内的数据共享。即对于相同的代码,多个模块在不同的线程中运行时,分别共享不同的数据 
  10.  * @see 每个线程调用全局的ThreadLocal.set()方法,就相当于在其内部的Map中增加一条记录,key是各自的线程,value是各自set()传进去的值 
  11.  * @see ============================================================================================================= 
  12.  * @see ThreadLocal的应用场景 
  13.  * @see 例如Struts2中的ActionContext,同一段代码被不同的线程调用运行时,该代码操作的数据是每个线程各自的状态和数据 
  14.  * @see 对于不同的线程来说,ActionContext.getContext()方法得到的对象都不相同 
  15.  * @see 对于同一个线程来说,ActionContext.getContext()方法无论在哪个模块中或者是被调用多少次,其得到的都是同一个对象 
  16.  * @see 通过查看com.opensymphony.xwork2.ActionContex的第43和166行源码,不难发现,Struts2就是这么做的 
  17.  * @see ============================================================================================================= 
  18.  * @see 线程中的成员变量和局部变量 
  19.  * @see 成员变量:多个线程操作同一个对象的成员变量时,它们对成员变量的改变是彼此影响的 
  20.  * @see 局部变量:每个线程都会有一个该局部变量的拷贝,一个线程对局部变量的改变不会影响到其它线程对该局部变量的操作 
  21.  * @see ============================================================================================================= 
  22.  * @author 宏宇
  23.  * @create Feb 27, 2012 12:10:24 AM 
  24.  */  
  25. public class ThreadLocalTest {  
  26.     public static void main(String[] args) {  
  27.         new Thread(new MyThread(new Random().nextInt())).start();  
  28.         new Thread(new MyThread(new Random().nextInt())).start();  
  29.     }  
  30. }  
  31.   
  32.   
  33. class MyThread implements Runnable{  
  34.     private Integer data;  
  35.     public MyThread(Integer data){  
  36.         this.data = data;  
  37.     }  
  38.     @Override  
  39.     public void run() {  
  40.         System.out.println(Thread.currentThread().getName() + " has put data:" + data);  
  41.         User.getThreadInstance().setName("name" + data);  
  42.         User.getThreadInstance().setAge(data);  
  43.         new Pig().getMyData();  
  44.         new Dog().getMyData();  
  45.     }  
  46. }  
  47.   
  48.   
  49. class Pig{  
  50.     public void getMyData(){  
  51.         User user = User.getThreadInstance();  
  52.         System.out.println("Pig from " + Thread.currentThread().getName() + " getMyData:" + user.getName() + "|" + user.getAge());  
  53.     }  
  54. }  
  55.   
  56.   
  57. class Dog{  
  58.     public void getMyData(){  
  59.         User user = User.getThreadInstance();  
  60.         System.out.println("Dog from " + Thread.currentThread().getName() + " getMyData:" + user.getName() + "|" + user.getAge());  
  61.     }  
  62. }  
  63.   
  64.   
  65.   
  66.   
  67. /** 
  68.  * 自定义的线程范围内共享的对象。即该类会针对不同的线程分别创建一个独立的对象 
  69.  * @see 此时每个线程得到的将是自己的实例,各线程间得到的实例没有任何关联 
  70.  * @see 我们可以拿它,与单例模式中的懒汉式,进行对比,这是个很有意思的东西 
  71.  * @see Struts2就是这么设计的,它的每一个请求就是一个线程 
  72.  */  
  73. class User{  
  74.     private static ThreadLocal instanceMap = new ThreadLocal();  
  75.       
  76.     private User(){}  
  77.       
  78.     /** 
  79.      * 得到与当前线程相关的,当前类的实例 
  80.      */  
  81.     public static /*synchronized*/ User getThreadInstance(){  
  82.         User instance = instanceMap.get();  
  83.         if(null == instance){  
  84.             instance = new User();  
  85.             instanceMap.set(instance);  
  86.         }  
  87.         return instance;  
  88.     }  
  89.       
  90.     private String name;  
  91.     private int age;  
  92.     public String getName() {  
  93.         return name;  
  94.     }  
  95.     public void setName(String name) {  
  96.         this.name = name;  
  97.     }  
  98.     public int getAge() {  
  99.         return age;  
  100.     }  
  101.     public void setAge(int age) {  
  102.         this.age = age;  
  103.     }  
  104. }  



Java ThreadLocal源码

[java] view plain copy
  1. /* 
  2.  * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved. 
  3.  * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 
  4.  * 
  5.  * 
  6.  * 
  7.  * 
  8.  * 
  9.  * 
  10.  * 
  11.  * 
  12.  * 
  13.  * 
  14.  * 
  15.  * 
  16.  * 
  17.  * 
  18.  * 
  19.  * 
  20.  * 
  21.  * 
  22.  * 
  23.  * 
  24.  */  
  25.   
  26. package java.lang;  
  27. import java.lang.ref.*;  
  28. import java.util.concurrent.atomic.AtomicInteger;  
  29.   
  30. /** 
  31.  * This class provides thread-local variables.  These variables differ from 
  32.  * their normal counterparts in that each thread that accesses one (via its 
  33.  * get or set method) has its own, independently initialized 
  34.  * copy of the variable.  ThreadLocal instances are typically private 
  35.  * static fields in classes that wish to associate state with a thread (e.g., 
  36.  * a user ID or Transaction ID). 
  37.  * 
  38.  * 

    For example, the class below generates unique identifiers local to each 

  39.  * thread. 
  40.  * A thread's id is assigned the first time it invokes ThreadId.get() 
  41.  * and remains unchanged on subsequent calls. 
  42.  * 
     
  43.  * import java.util.concurrent.atomic.AtomicInteger; 
  44.  * 
  45.  * public class ThreadId { 
  46.  *     // Atomic integer containing the next thread ID to be assigned 
  47.  *     private static final AtomicInteger nextId = new AtomicInteger(0); 
  48.  * 
  49.  *     // Thread local variable containing each thread's ID 
  50.  *     private static final ThreadLocal threadId = 
  51.  *         new ThreadLocal() { 
  52.  *             @Override protected Integer initialValue() { 
  53.  *                 return nextId.getAndIncrement(); 
  54.  *         } 
  55.  *     }; 
  56.  * 
  57.  *     // Returns the current thread's unique ID, assigning it if necessary 
  58.  *     public static int get() { 
  59.  *         return threadId.get(); 
  60.  *     } 
  61.  * } 
  62.  *  
  63.  * 

    Each thread holds an implicit reference to its copy of a thread-local 

  64.  * variable as long as the thread is alive and the ThreadLocal 
  65.  * instance is accessible; after a thread goes away, all of its copies of 
  66.  * thread-local instances are subject to garbage collection (unless other 
  67.  * references to these copies exist). 
  68.  * 
  69.  * @author  Josh Bloch and Doug Lea 
  70.  * @since   1.2 
  71.  */  
  72. public class ThreadLocal {  
  73.     /** 
  74.      * ThreadLocals rely on per-thread linear-probe hash maps attached 
  75.      * to each thread (Thread.threadLocals and 
  76.      * inheritableThreadLocals).  The ThreadLocal objects act as keys, 
  77.      * searched via threadLocalHashCode.  This is a custom hash code 
  78.      * (useful only within ThreadLocalMaps) that eliminates collisions 
  79.      * in the common case where consecutively constructed ThreadLocals 
  80.      * are used by the same threads, while remaining well-behaved in 
  81.      * less common cases. 
  82.      */  
  83.     private final int threadLocalHashCode = nextHashCode();  
  84.   
  85.     /** 
  86.      * The next hash code to be given out. Updated atomically. Starts at 
  87.      * zero. 
  88.      */  
  89.     private static AtomicInteger nextHashCode =  
  90.         new AtomicInteger();  
  91.   
  92.     /** 
  93.      * The difference between successively generated hash codes - turns 
  94.      * implicit sequential thread-local IDs into near-optimally spread 
  95.      * multiplicative hash values for power-of-two-sized tables. 
  96.      */  
  97.     private static final int HASH_INCREMENT = 0x61c88647;  
  98.   
  99.     /** 
  100.      * Returns the next hash code. 
  101.      */  
  102.     private static int nextHashCode() {  
  103.         return nextHashCode.getAndAdd(HASH_INCREMENT);  
  104.     }  
  105.   
  106.     /** 
  107.      * Returns the current thread's "initial value" for this 
  108.      * thread-local variable.  This method will be invoked the first 
  109.      * time a thread accesses the variable with the {@link #get} 
  110.      * method, unless the thread previously invoked the {@link #set} 
  111.      * method, in which case the initialValue method will not 
  112.      * be invoked for the thread.  Normally, this method is invoked at 
  113.      * most once per thread, but it may be invoked again in case of 
  114.      * subsequent invocations of {@link #remove} followed by {@link #get}. 
  115.      * 
  116.      * 

    This implementation simply returns null; if the 

  117.      * programmer desires thread-local variables to have an initial 
  118.      * value other than nullThreadLocal must be 
  119.      * subclassed, and this method overridden.  Typically, an 
  120.      * anonymous inner class will be used. 
  121.      * 
  122.      * @return the initial value for this thread-local 
  123.      */  
  124.     protected T initialValue() {  
  125.         return null;  
  126.     }  
  127.   
  128.     /** 
  129.      * Creates a thread local variable. 
  130.      */  
  131.     public ThreadLocal() {  
  132.     }  
  133.   
  134.     /** 
  135.      * Returns the value in the current thread's copy of this 
  136.      * thread-local variable.  If the variable has no value for the 
  137.      * current thread, it is first initialized to the value returned 
  138.      * by an invocation of the {@link #initialValue} method. 
  139.      * 
  140.      * @return the current thread's value of this thread-local 
  141.      */  
  142.     public T get() {  
  143.         Thread t = Thread.currentThread();  
  144.         ThreadLocalMap map = getMap(t);  
  145.         if (map != null) {  
  146.             ThreadLocalMap.Entry e = map.getEntry(this);  
  147.             if (e != null)  
  148.                 return (T)e.value;  
  149.         }  
  150.         return setInitialValue();  
  151.     }  
  152.   
  153.     /** 
  154.      * Variant of set() to establish initialValue. Used instead 
  155.      * of set() in case user has overridden the set() method. 
  156.      * 
  157.      * @return the initial value 
  158.      */  
  159.     private T setInitialValue() {  
  160.         T value = initialValue();  
  161.         Thread t = Thread.currentThread();  
  162.         ThreadLocalMap map = getMap(t);  
  163.         if (map != null)  
  164.             map.set(this, value);  
  165.         else  
  166.             createMap(t, value);  
  167.         return value;  
  168.     }  
  169.   
  170.     /** 
  171.      * Sets the current thread's copy of this thread-local variable 
  172.      * to the specified value.  Most subclasses will have no need to 
  173.      * override this method, relying solely on the {@link #initialValue} 
  174.      * method to set the values of thread-locals. 
  175.      * 
  176.      * @param value the value to be stored in the current thread's copy of 
  177.      *        this thread-local. 
  178.      */  
  179.     public void set(T value) {  
  180.         Thread t = Thread.currentThread();  
  181.         ThreadLocalMap map = getMap(t);  
  182.         if (map != null)  
  183.             map.set(this, value);  
  184.         else  
  185.             createMap(t, value);  
  186.     }  
  187.   
  188.     /** 
  189.      * Removes the current thread's value for this thread-local 
  190.      * variable.  If this thread-local variable is subsequently 
  191.      * {@linkplain #get read} by the current thread, its value will be 
  192.      * reinitialized by invoking its {@link #initialValue} method, 
  193.      * unless its value is {@linkplain #set set} by the current thread 
  194.      * in the interim.  This may result in multiple invocations of the 
  195.      * initialValue method in the current thread. 
  196.      * 
  197.      * @since 1.5 
  198.      */  
  199.      public void remove() {  
  200.          ThreadLocalMap m = getMap(Thread.currentThread());  
  201.          if (m != null)  
  202.              m.remove(this);  
  203.      }  
  204.   
  205.     /** 
  206.      * Get the map associated with a ThreadLocal. Overridden in 
  207.      * InheritableThreadLocal. 
  208.      * 
  209.      * @param  t the current thread 
  210.      * @return the map 
  211.      */  
  212.     ThreadLocalMap getMap(Thread t) {  
  213.         return t.threadLocals;  
  214.     }  
  215.   
  216.     /** 
  217.      * Create the map associated with a ThreadLocal. Overridden in 
  218.      * InheritableThreadLocal. 
  219.      * 
  220.      * @param t the current thread 
  221.      * @param firstValue value for the initial entry of the map 
  222.      * @param map the map to store. 
  223.      */  
  224.     void createMap(Thread t, T firstValue) {  
  225.         t.threadLocals = new ThreadLocalMap(this, firstValue);  
  226.     }  
  227.   
  228.     /** 
  229.      * Factory method to create map of inherited thread locals. 
  230.      * Designed to be called only from Thread constructor. 
  231.      * 
  232.      * @param  parentMap the map associated with parent thread 
  233.      * @return a map containing the parent's inheritable bindings 
  234.      */  
  235.     static ThreadLocalMap createInheritedMap(ThreadLocalMap parentMap) {  
  236.         return new ThreadLocalMap(parentMap);  
  237.     }  
  238.   
  239.     /** 
  240.      * Method childValue is visibly defined in subclass 
  241.      * InheritableThreadLocal, but is internally defined here for the 
  242.      * sake of providing createInheritedMap factory method without 
  243.      * needing to subclass the map class in InheritableThreadLocal. 
  244.      * This technique is preferable to the alternative of embedding 
  245.      * instanceof tests in methods. 
  246.      */  
  247.     T childValue(T parentValue) {  
  248.         throw new UnsupportedOperationException();  
  249.     }  
  250.   
  251.     /** 
  252.      * ThreadLocalMap is a customized hash map suitable only for 
  253.      * maintaining thread local values. No operations are exported 
  254.      * outside of the ThreadLocal class. The class is package private to 
  255.      * allow declaration of fields in class Thread.  To help deal with 
  256.      * very large and long-lived usages, the hash table entries use 
  257.      * WeakReferences for keys. However, since reference queues are not 
  258.      * used, stale entries are guaranteed to be removed only when 
  259.      * the table starts running out of space. 
  260.      */  
  261.     static class ThreadLocalMap {  
  262.   
  263.         /** 
  264.          * The entries in this hash map extend WeakReference, using 
  265.          * its main ref field as the key (which is always a 
  266.          * ThreadLocal object).  Note that null keys (i.e. entry.get() 
  267.          * == null) mean that the key is no longer referenced, so the 
  268.          * entry can be expunged from table.  Such entries are referred to 
  269.          * as "stale entries" in the code that follows. 
  270.          */  
  271.         static class Entry extends WeakReference {  
  272.             /** The value associated with this ThreadLocal. */  
  273.             Object value;  
  274.   
  275.             Entry(ThreadLocal k, Object v) {  
  276.                 super(k);  
  277.                 value = v;  
  278.             }  
  279.         }  
  280.   
  281.         /** 
  282.          * The initial capacity -- MUST be a power of two. 
  283.          */  
  284.         private static final int INITIAL_CAPACITY = 16;  
  285.   
  286.         /** 
  287.          * The table, resized as necessary. 
  288.          * table.length MUST always be a power of two. 
  289.          */  
  290.         private Entry[] table;  
  291.   
  292.         /** 
  293.          * The number of entries in the table. 
  294.          */  
  295.         private int size = 0;  
  296.   
  297.         /** 
  298.          * The next size value at which to resize. 
  299.          */  
  300.         private int threshold; // Default to 0  
  301.   
  302.         /** 
  303.          * Set the resize threshold to maintain at worst a 2/3 load factor. 
  304.          */  
  305.         private void setThreshold(int len) {  
  306.             threshold = len * 2 / 3;  
  307.         }  
  308.   
  309.         /** 
  310.          * Increment i modulo len. 
  311.          */  
  312.         private static int nextIndex(int i, int len) {  
  313.             return ((i + 1 < len) ? i + 1 : 0);  
  314.         }  
  315.   
  316.         /** 
  317.          * Decrement i modulo len. 
  318.          */  
  319.         private static int prevIndex(int i, int len) {  
  320.             return ((i - 1 >= 0) ? i - 1 : len - 1);  
  321.         }  
  322.   
  323.         /** 
  324.          * Construct a new map initially containing (firstKey, firstValue). 
  325.          * ThreadLocalMaps are constructed lazily, so we only create 
  326.          * one when we have at least one entry to put in it. 
  327.          */  
  328.         ThreadLocalMap(ThreadLocal firstKey, Object firstValue) {  
  329.             table = new Entry[INITIAL_CAPACITY];  
  330.             int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);  
  331.             table[i] = new Entry(firstKey, firstValue);  
  332.             size = 1;  
  333.             setThreshold(INITIAL_CAPACITY);  
  334.         }  
  335.   
  336.         /** 
  337.          * Construct a new map including all Inheritable ThreadLocals 
  338.          * from given parent map. Called only by createInheritedMap. 
  339.          * 
  340.          * @param parentMap the map associated with parent thread. 
  341.          */  
  342.         private ThreadLocalMap(ThreadLocalMap parentMap) {  
  343.             Entry[] parentTable = parentMap.table;  
  344.             int len = parentTable.length;  
  345.             setThreshold(len);  
  346.             table = new Entry[len];  
  347.   
  348.             for (int j = 0; j < len; j++) {  
  349.                 Entry e = parentTable[j];  
  350.                 if (e != null) {  
  351.                     ThreadLocal key = e.get();  
  352.                     if (key != null) {  
  353.                         Object value = key.childValue(e.value);  
  354.                         Entry c = new Entry(key, value);  
  355.                         int h = key.threadLocalHashCode & (len - 1);  
  356.                         while (table[h] != null)  
  357.                             h = nextIndex(h, len);  
  358.                         table[h] = c;  
  359.                         size++;  
  360.                     }  
  361.                 }  
  362.             }  
  363.         }  
  364.   
  365.         /** 
  366.          * Get the entry associated with key.  This method 
  367.          * itself handles only the fast path: a direct hit of existing 
  368.          * key. It otherwise relays to getEntryAfterMiss.  This is 
  369.          * designed to maximize performance for direct hits, in part 
  370.          * by making this method readily inlinable. 
  371.          * 
  372.          * @param  key the thread local object 
  373.          * @return the entry associated with key, or null if no such 
  374.          */  
  375.         private Entry getEntry(ThreadLocal key) {  
  376.             int i = key.threadLocalHashCode & (table.length - 1);  
  377.             Entry e = table[i];  
  378.             if (e != null && e.get() == key)  
  379.                 return e;  
  380.             else  
  381.                 return getEntryAfterMiss(key, i, e);  
  382.         }  
  383.   
  384.         /** 
  385.          * Version of getEntry method for use when key is not found in 
  386.          * its direct hash slot. 
  387.          * 
  388.          * @param  key the thread local object 
  389.          * @param  i the table index for key's hash code 
  390.          * @param  e the entry at table[i] 
  391.          * @return the entry associated with key, or null if no such 
  392.          */  
  393.         private Entry getEntryAfterMiss(ThreadLocal key, int i, Entry e) {  
  394.             Entry[] tab = table;  
  395.             int len = tab.length;  
  396.   
  397.             while (e != null) {  
  398.                 ThreadLocal k = e.get();  
  399.                 if (k == key)  
  400.                     return e;  
  401.                 if (k == null)  
  402.                     expungeStaleEntry(i);  
  403.                 else  
  404.                     i = nextIndex(i, len);  
  405.                 e = tab[i];  
  406.             }  
  407.             return null;  
  408.         }  
  409.   
  410.         /** 
  411.          * Set the value associated with key. 
  412.          * 
  413.          * @param key the thread local object 
  414.          * @param value the value to be set 
  415.          */  
  416.         private void set(ThreadLocal key, Object value) {  
  417.   
  418.             // We don't use a fast path as with get() because it is at  
  419.             // least as common to use set() to create new entries as  
  420.             // it is to replace existing ones, in which case, a fast  
  421.             // path would fail more often than not.  
  422.   
  423.             Entry[] tab = table;  
  424.             int len = tab.length;  
  425.             int i = key.threadLocalHashCode & (len-1);  
  426.   
  427.             for (Entry e = tab[i];  
  428.                  e != null;  
  429.                  e = tab[i = nextIndex(i, len)]) {  
  430.                 ThreadLocal k = e.get();  
  431.   
  432.                 if (k == key) {  
  433.                     e.value = value;  
  434.                     return;  
  435.                 }  
  436.   
  437.                 if (k == null) {  
  438.                     replaceStaleEntry(key, value, i);  
  439.                     return;  
  440.                 }  
  441.             }  
  442.   
  443.             tab[i] = new Entry(key, value);  
  444.             int sz = ++size;  
  445.             if (!cleanSomeSlots(i, sz) && sz >= threshold)  
  446.                 rehash();  
  447.         }  
  448.   
  449.         /** 
  450.          * Remove the entry for key. 
  451.          */  
  452.         private void remove(ThreadLocal key) {  
  453.             Entry[] tab = table;  
  454.             int len = tab.length;  
  455.             int i = key.threadLocalHashCode & (len-1);  
  456.             for (Entry e = tab[i];  
  457.                  e != null;  
  458.                  e = tab[i = nextIndex(i, len)]) {  
  459.                 if (e.get() == key) {  
  460.                     e.clear();  
  461.                     expungeStaleEntry(i);  
  462.                     return;  
  463.                 }  
  464.             }  
  465.         }  
  466.   
  467.         /** 
  468.          * Replace a stale entry encountered during a set operation 
  469.          * with an entry for the specified key.  The value passed in 
  470.          * the value parameter is stored in the entry, whether or not 
  471.          * an entry already exists for the specified key. 
  472.          * 
  473.          * As a side effect, this method expunges all stale entries in the 
  474.          * "run" containing the stale entry.  (A run is a sequence of entries 
  475.          * between two null slots.) 
  476.          * 
  477.          * @param  key the key 
  478.          * @param  value the value to be associated with key 
  479.          * @param  staleSlot index of the first stale entry encountered while 
  480.          *         searching for key. 
  481.          */  
  482.         private void replaceStaleEntry(ThreadLocal key, Object value,  
  483.                                        int staleSlot) {  
  484.             Entry[] tab = table;  
  485.             int len = tab.length;  
  486.             Entry e;  
  487.   
  488.             // Back up to check for prior stale entry in current run.  
  489.             // We clean out whole runs at a time to avoid continual  
  490.             // incremental rehashing due to garbage collector freeing  
  491.             // up refs in bunches (i.e., whenever the collector runs).  
  492.             int slotToExpunge = staleSlot;  
  493.             for (int i = prevIndex(staleSlot, len);  
  494.                  (e = tab[i]) != null;  
  495.                  i = prevIndex(i, len))  
  496.                 if (e.get() == null)  
  497.                     slotToExpunge = i;  
  498.   
  499.             // Find either the key or trailing null slot of run, whichever  
  500.             // occurs first  
  501.             for (int i = nextIndex(staleSlot, len);  
  502.                  (e = tab[i]) != null;  
  503.                  i = nextIndex(i, len)) {  
  504.                 ThreadLocal k = e.get();  
  505.   
  506.                 // If we find key, then we need to swap it  
  507.                 // with the stale entry to maintain hash table order.  
  508.                 // The newly stale slot, or any other stale slot  
  509.                 // encountered above it, can then be sent to expungeStaleEntry  
  510.                 // to remove or rehash all of the other entries in run.  
  511.                 if (k == key) {  
  512.                     e.value = value;  
  513.   
  514.                     tab[i] = tab[staleSlot];  
  515.                     tab[staleSlot] = e;  
  516.   
  517.                     // Start expunge at preceding stale entry if it exists  
  518.                     if (slotToExpunge == staleSlot)  
  519.                         slotToExpunge = i;  
  520.                     cleanSomeSlots(expungeStaleEntry(slotToExpunge), len);  
  521.                     return;  
  522.                 }  
  523.   
  524.                 // If we didn't find stale entry on backward scan, the  
  525.                 // first stale entry seen while scanning for key is the  
  526.                 // first still present in the run.  
  527.                 if (k == null && slotToExpunge == staleSlot)  
  528.                     slotToExpunge = i;  
  529.             }  
  530.   
  531.             // If key not found, put new entry in stale slot  
  532.             tab[staleSlot].value = null;  
  533.             tab[staleSlot] = new Entry(key, value);  
  534.   
  535.             // If there are any other stale entries in run, expunge them  
  536.             if (slotToExpunge != staleSlot)  
  537.                 cleanSomeSlots(expungeStaleEntry(slotToExpunge), len);  
  538.         }  
  539.   
  540.         /** 
  541.          * Expunge a stale entry by rehashing any possibly colliding entries 
  542.          * lying between staleSlot and the next null slot.  This also expunges 
  543.          * any other stale entries encountered before the trailing null.  See 
  544.          * Knuth, Section 6.4 
  545.          * 
  546.          * @param staleSlot index of slot known to have null key 
  547.          * @return the index of the next null slot after staleSlot 
  548.          * (all between staleSlot and this slot will have been checked 
  549.          * for expunging). 
  550.          */  
  551.         private int expungeStaleEntry(int staleSlot) {  
  552.             Entry[] tab = table;  
  553.             int len = tab.length;  
  554.   
  555.             // expunge entry at staleSlot  
  556.             tab[staleSlot].value = null;  
  557.             tab[staleSlot] = null;  
  558.             size--;  
  559.   
  560.             // Rehash until we encounter null  
  561.             Entry e;  
  562.             int i;  
  563.             for (i = nextIndex(staleSlot, len);  
  564.                  (e = tab[i]) != null;  
  565.                  i = nextIndex(i, len)) {  
  566.                 ThreadLocal k = e.get();  
  567.                 if (k == null) {  
  568.                     e.value = null;  
  569.                     tab[i] = null;  
  570.                     size--;  
  571.                 } else {  
  572.                     int h = k.threadLocalHashCode & (len - 1);  
  573.                     if (h != i) {  
  574.                         tab[i] = null;  
  575.   
  576.                         // Unlike Knuth 6.4 Algorithm R, we must scan until  
  577.                         // null because multiple entries could have been stale.  
  578.                         while (tab[h] != null)  
  579.                             h = nextIndex(h, len);  
  580.                         tab[h] = e;  
  581.                     }  
  582.                 }  
  583.             }  
  584.             return i;  
  585.         }  
  586.   
  587.         /** 
  588.          * Heuristically scan some cells looking for stale entries. 
  589.          * This is invoked when either a new element is added, or 
  590.          * another stale one has been expunged. It performs a 
  591.          * logarithmic number of scans, as a balance between no 
  592.          * scanning (fast but retains garbage) and a number of scans 
  593.          * proportional to number of elements, that would find all 
  594.          * garbage but would cause some insertions to take O(n) time. 
  595.          * 
  596.          * @param i a position known NOT to hold a stale entry. The 
  597.          * scan starts at the element after i. 
  598.          * 
  599.          * @param n scan control: log2(n) cells are scanned, 
  600.          * unless a stale entry is found, in which case 
  601.          * log2(table.length)-1 additional cells are scanned. 
  602.          * When called from insertions, this parameter is the number 
  603.          * of elements, but when from replaceStaleEntry, it is the 
  604.          * table length. (Note: all this could be changed to be either 
  605.          * more or less aggressive by weighting n instead of just 
  606.          * using straight log n. But this version is simple, fast, and 
  607.          * seems to work well.) 
  608.          * 
  609.          * @return true if any stale entries have been removed. 
  610.          */  
  611.         private boolean cleanSomeSlots(int i, int n) {  
  612.             boolean removed = false;  
  613.             Entry[] tab = table;  
  614.             int len = tab.length;  
  615.             do {  
  616.                 i = nextIndex(i, len);  
  617.                 Entry e = tab[i];  
  618.                 if (e != null && e.get() == null) {  
  619.                     n = len;  
  620.                     removed = true;  
  621.                     i = expungeStaleEntry(i);  
  622.                 }  
  623.             } while ( (n >>>= 1) != 0);  
  624.             return removed;  
  625.         }  
  626.   
  627.         /** 
  628.          * Re-pack and/or re-size the table. First scan the entire 
  629.          * table removing stale entries. If this doesn't sufficiently 
  630.          * shrink the size of the table, double the table size. 
  631.          */  
  632.         private void rehash() {  
  633.             expungeStaleEntries();  
  634.   
  635.             // Use lower threshold for doubling to avoid hysteresis  
  636.             if (size >= threshold - threshold / 4)  
  637.                 resize();  
  638.         }  
  639.   
  640.         /** 
  641.          * Double the capacity of the table. 
  642.          */  
  643.         private void resize() {  
  644.             Entry[] oldTab = table;  
  645.             int oldLen = oldTab.length;  
  646.             int newLen = oldLen * 2;  
  647.             Entry[] newTab = new Entry[newLen];  
  648.             int count = 0;  
  649.   
  650.             for (int j = 0; j < oldLen; ++j) {  
  651.                 Entry e = oldTab[j];  
  652.                 if (e != null) {  
  653.                     ThreadLocal k = e.get();  
  654.                     if (k == null) {  
  655.                         e.value = null; // Help the GC  
  656.                     } else {  
  657.                         int h = k.threadLocalHashCode & (newLen - 1);  
  658.                         while (newTab[h] != null)  
  659.                             h = nextIndex(h, newLen);  
  660.                         newTab[h] = e;  
  661.                         count++;  
  662.                     }  
  663.                 }  
  664.             }  
  665.   
  666.             setThreshold(newLen);  
  667.             size = count;  
  668.             table = newTab;  
  669.         }  
  670.   
  671.         /** 
  672.          * Expunge all stale entries in the table. 
  673.          */  
  674.         private void expungeStaleEntries() {  
  675.             Entry[] tab = table;  
  676.             int len = tab.length;  
  677.             for (int j = 0; j < len; j++) {  
  678.                 Entry e = tab[j];  
  679.                 if (e != null && e.get() == null)  
  680.                     expungeStaleEntry(j);  
  681.             }  
  682.         }  
  683.     }  
  684. }  


Javathread源码

[java] view plain copy
  1. /* 
  2.  * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. 
  3.  * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 
  4.  * 
  5.  * 
  6.  * 
  7.  * 
  8.  * 
  9.  * 
  10.  * 
  11.  * 
  12.  * 
  13.  * 
  14.  * 
  15.  * 
  16.  * 
  17.  * 
  18.  * 
  19.  * 
  20.  * 
  21.  * 
  22.  * 
  23.  * 
  24.  */  
  25.   
  26. package java.lang;  
  27.   
  28. import java.lang.ref.Reference;  
  29. import java.lang.ref.ReferenceQueue;  
  30. import java.lang.ref.WeakReference;  
  31. import java.security.AccessController;  
  32. import java.security.AccessControlContext;  
  33. import java.security.PrivilegedAction;  
  34. import java.util.Map;  
  35. import java.util.HashMap;  
  36. import java.util.concurrent.ConcurrentHashMap;  
  37. import java.util.concurrent.ConcurrentMap;  
  38. import java.util.concurrent.locks.LockSupport;  
  39. import sun.nio.ch.Interruptible;  
  40. import sun.security.util.SecurityConstants;  
  41.   
  42.   
  43. /** 
  44.  * A thread is a thread of execution in a program. The Java 
  45.  * Virtual Machine allows an application to have multiple threads of 
  46.  * execution running concurrently. 
  47.  * 

     

  48.  * Every thread has a priority. Threads with higher priority are 
  49.  * executed in preference to threads with lower priority. Each thread 
  50.  * may or may not also be marked as a daemon. When code running in 
  51.  * some thread creates a new Thread object, the new 
  52.  * thread has its priority initially set equal to the priority of the 
  53.  * creating thread, and is a daemon thread if and only if the 
  54.  * creating thread is a daemon. 
  55.  * 

     

  56.  * When a Java Virtual Machine starts up, there is usually a single 
  57.  * non-daemon thread (which typically calls the method named 
  58.  * main of some designated class). The Java Virtual 
  59.  * Machine continues to execute threads until either of the following 
  60.  * occurs: 
  61.  * 
       
    •  * 
    • The exit method of class Runtime has been 
    •  *     called and the security manager has permitted the exit operation 
    •  *     to take place. 
    •  * 
    • All threads that are not daemon threads have died, either by 
    •  *     returning from the call to the run method or by 
    •  *     throwing an exception that propagates beyond the run 
    •  *     method. 
    •  * 
     
  62.  * 

     

  63.  * There are two ways to create a new thread of execution. One is to 
  64.  * declare a class to be a subclass of Thread. This 
  65.  * subclass should override the run method of class 
  66.  * Thread. An instance of the subclass can then be 
  67.  * allocated and started. For example, a thread that computes primes 
  68.  * larger than a stated value could be written as follows: 
  69.  * 


     
  70.  *     class PrimeThread extends Thread { 
  71.  *         long minPrime; 
  72.  *         PrimeThread(long minPrime) { 
  73.  *             this.minPrime = minPrime; 
  74.  *         } 
  75.  * 
  76.  *         public void run() { 
  77.  *             // compute primes larger than minPrime 
  78.  *              . . . 
  79.  *         } 
  80.  *     } 
  81.  * 
     
  82.  * 

     

  83.  * The following code would then create a thread and start it running: 
  84.  * 

     
  85.  *     PrimeThread p = new PrimeThread(143); 
  86.  *     p.start(); 
  87.  *  
  88.  * 

     

  89.  * The other way to create a thread is to declare a class that 
  90.  * implements the Runnable interface. That class then 
  91.  * implements the run method. An instance of the class can 
  92.  * then be allocated, passed as an argument when creating 
  93.  * Thread, and started. The same example in this other 
  94.  * style looks like the following: 
  95.  * 


     
  96.  *     class PrimeRun implements Runnable { 
  97.  *         long minPrime; 
  98.  *         PrimeRun(long minPrime) { 
  99.  *             this.minPrime = minPrime; 
  100.  *         } 
  101.  * 
  102.  *         public void run() { 
  103.  *             // compute primes larger than minPrime 
  104.  *              . . . 
  105.  *         } 
  106.  *     } 
  107.  * 
     
  108.  * 

     

  109.  * The following code would then create a thread and start it running: 
  110.  * 

     
  111.  *     PrimeRun p = new PrimeRun(143); 
  112.  *     new Thread(p).start(); 
  113.  *  
  114.  * 

     

  115.  * Every thread has a name for identification purposes. More than 
  116.  * one thread may have the same name. If a name is not specified when 
  117.  * a thread is created, a new name is generated for it. 
  118.  * 

     

  119.  * Unless otherwise noted, passing a {@code null} argument to a constructor 
  120.  * or method in this class will cause a {@link NullPointerException} to be 
  121.  * thrown. 
  122.  * 
  123.  * @author  unascribed 
  124.  * @see     Runnable 
  125.  * @see     Runtime#exit(int) 
  126.  * @see     #run() 
  127.  * @see     #stop() 
  128.  * @since   JDK1.0 
  129.  */  
  130. public  
  131. class Thread implements Runnable {  
  132.     /* Make sure registerNatives is the first thing  does. */  
  133.     private static native void registerNatives();  
  134.     static {  
  135.         registerNatives();  
  136.     }  
  137.   
  138.     private char        name[];  
  139.     private int         priority;  
  140.     private Thread      threadQ;  
  141.     private long        eetop;  
  142.   
  143.     /* Whether or not to single_step this thread. */  
  144.     private boolean     single_step;  
  145.   
  146.     /* Whether or not the thread is a daemon thread. */  
  147.     private boolean     daemon = false;  
  148.   
  149.     /* JVM state */  
  150.     private boolean     stillborn = false;  
  151.   
  152.     /* What will be run. */  
  153.     private Runnable target;  
  154.   
  155.     /* The group of this thread */  
  156.     private ThreadGroup group;  
  157.   
  158.     /* The context ClassLoader for this thread */  
  159.     private ClassLoader contextClassLoader;  
  160.   
  161.     /* The inherited AccessControlContext of this thread */  
  162.     private AccessControlContext inheritedAccessControlContext;  
  163.   
  164.     /* For autonumbering anonymous threads. */  
  165.     private static int threadInitNumber;  
  166.     private static synchronized int nextThreadNum() {  
  167.         return threadInitNumber++;  
  168.     }  
  169.   
  170.     /* ThreadLocal values pertaining to this thread. This map is maintained 
  171.      * by the ThreadLocal class. */  
  172.     ThreadLocal.ThreadLocalMap threadLocals = null;  
  173.   
  174.     /* 
  175.      * InheritableThreadLocal values pertaining to this thread. This map is 
  176.      * maintained by the InheritableThreadLocal class. 
  177.      */  
  178.     ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;  
  179.   
  180.     /* 
  181.      * The requested stack size for this thread, or 0 if the creator did 
  182.      * not specify a stack size.  It is up to the VM to do whatever it 
  183.      * likes with this number; some VMs will ignore it. 
  184.      */  
  185.     private long stackSize;  
  186.   
  187.     /* 
  188.      * JVM-private state that persists after native thread termination. 
  189.      */  
  190.     private long nativeParkEventPointer;  
  191.   
  192.     /* 
  193.      * Thread ID 
  194.      */  
  195.     private long tid;  
  196.   
  197.     /* For generating thread ID */  
  198.     private static long threadSeqNumber;  
  199.   
  200.     /* Java thread status for tools, 
  201.      * initialized to indicate thread 'not yet started' 
  202.      */  
  203.   
  204.     private volatile int threadStatus = 0;  
  205.   
  206.   
  207.     private static synchronized long nextThreadID() {  
  208.         return ++threadSeqNumber;  
  209.     }  
  210.   
  211.     /** 
  212.      * The argument supplied to the current call to 
  213.      * java.util.concurrent.locks.LockSupport.park. 
  214.      * Set by (private) java.util.concurrent.locks.LockSupport.setBlocker 
  215.      * Accessed using java.util.concurrent.locks.LockSupport.getBlocker 
  216.      */  
  217.     volatile Object parkBlocker;  
  218.   
  219.     /* The object in which this thread is blocked in an interruptible I/O 
  220.      * operation, if any.  The blocker's interrupt method should be invoked 
  221.      * after setting this thread's interrupt status. 
  222.      */  
  223.     private volatile Interruptible blocker;  
  224.     private final Object blockerLock = new Object();  
  225.   
  226.     /* Set the blocker field; invoked via sun.misc.SharedSecrets from java.nio code 
  227.      */  
  228.     void blockedOn(Interruptible b) {  
  229.         synchronized (blockerLock) {  
  230.             blocker = b;  
  231.         }  
  232.     }  
  233.   
  234.     /** 
  235.      * The minimum priority that a thread can have. 
  236.      */  
  237.     public final static int MIN_PRIORITY = 1;  
  238.   
  239.    /** 
  240.      * The default priority that is assigned to a thread. 
  241.      */  
  242.     public final static int NORM_PRIORITY = 5;  
  243.   
  244.     /** 
  245.      * The maximum priority that a thread can have. 
  246.      */  
  247.     public final static int MAX_PRIORITY = 10;  
  248.   
  249.     /** 
  250.      * Returns a reference to the currently executing thread object. 
  251.      * 
  252.      * @return  the currently executing thread. 
  253.      */  
  254.     public static native Thread currentThread();  
  255.   
  256.     /** 
  257.      * A hint to the scheduler that the current thread is willing to yield 
  258.      * its current use of a processor. The scheduler is free to ignore this 
  259.      * hint. 
  260.      * 
  261.      * 

     Yield is a heuristic attempt to improve relative progression 

  262.      * between threads that would otherwise over-utilise a CPU. Its use 
  263.      * should be combined with detailed profiling and benchmarking to 
  264.      * ensure that it actually has the desired effect. 
  265.      * 
  266.      * 

     It is rarely appropriate to use this method. It may be useful 

  267.      * for debugging or testing purposes, where it may help to reproduce 
  268.      * bugs due to race conditions. It may also be useful when designing 
  269.      * concurrency control constructs such as the ones in the 
  270.      * {@link java.util.concurrent.locks} package. 
  271.      */  
  272.     public static native void yield();  
  273.   
  274.     /** 
  275.      * Causes the currently executing thread to sleep (temporarily cease 
  276.      * execution) for the specified number of milliseconds, subject to 
  277.      * the precision and accuracy of system timers and schedulers. The thread 
  278.      * does not lose ownership of any monitors. 
  279.      * 
  280.      * @param  millis 
  281.      *         the length of time to sleep in milliseconds 
  282.      * 
  283.      * @throws  IllegalArgumentException 
  284.      *          if the value of {@code millis} is negative 
  285.      * 
  286.      * @throws  InterruptedException 
  287.      *          if any thread has interrupted the current thread. The 
  288.      *          interrupted status of the current thread is 
  289.      *          cleared when this exception is thrown. 
  290.      */  
  291.     public static native void sleep(long millis) throws InterruptedException;  
  292.   
  293.     /** 
  294.      * Causes the currently executing thread to sleep (temporarily cease 
  295.      * execution) for the specified number of milliseconds plus the specified 
  296.      * number of nanoseconds, subject to the precision and accuracy of system 
  297.      * timers and schedulers. The thread does not lose ownership of any 
  298.      * monitors. 
  299.      * 
  300.      * @param  millis 
  301.      *         the length of time to sleep in milliseconds 
  302.      * 
  303.      * @param  nanos 
  304.      *         {@code 0-999999} additional nanoseconds to sleep 
  305.      * 
  306.      * @throws  IllegalArgumentException 
  307.      *          if the value of {@code millis} is negative, or the value of 
  308.      *          {@code nanos} is not in the range {@code 0-999999} 
  309.      * 
  310.      * @throws  InterruptedException 
  311.      *          if any thread has interrupted the current thread. The 
  312.      *          interrupted status of the current thread is 
  313.      *          cleared when this exception is thrown. 
  314.      */  
  315.     public static void sleep(long millis, int nanos)  
  316.     throws InterruptedException {  
  317.         if (millis < 0) {  
  318.             throw new IllegalArgumentException("timeout value is negative");  
  319.         }  
  320.   
  321.         if (nanos < 0 || nanos > 999999) {  
  322.             throw new IllegalArgumentException(  
  323.                                 "nanosecond timeout value out of range");  
  324.         }  
  325.   
  326.         if (nanos >= 500000 || (nanos != 0 && millis == 0)) {  
  327.             millis++;  
  328.         }  
  329.   
  330.         sleep(millis);  
  331.     }  
  332.   
  333.     /** 
  334.      * Initializes a Thread. 
  335.      * 
  336.      * @param g the Thread group 
  337.      * @param target the object whose run() method gets called 
  338.      * @param name the name of the new Thread 
  339.      * @param stackSize the desired stack size for the new thread, or 
  340.      *        zero to indicate that this parameter is to be ignored. 
  341.      */  
  342.     private void init(ThreadGroup g, Runnable target, String name,  
  343.                       long stackSize) {  
  344.         if (name == null) {  
  345.             throw new NullPointerException("name cannot be null");  
  346.         }  
  347.   
  348.         Thread parent = currentThread();  
  349.         SecurityManager security = System.getSecurityManager();  
  350.         if (g == null) {  
  351.             /* Determine if it's an applet or not */  
  352.   
  353.             /* If there is a security manager, ask the security manager 
  354.                what to do. */  
  355.             if (security != null) {  
  356.                 g = security.getThreadGroup();  
  357.             }  
  358.   
  359.             /* If the security doesn't have a strong opinion of the matter 
  360.                use the parent thread group. */  
  361.             if (g == null) {  
  362.                 g = parent.getThreadGroup();  
  363.             }  
  364.         }  
  365.   
  366.         /* checkAccess regardless of whether or not threadgroup is 
  367.            explicitly passed in. */  
  368.         g.checkAccess();  
  369.   
  370.         /* 
  371.          * Do we have the required permissions? 
  372.          */  
  373.         if (security != null) {  
  374.             if (isCCLOverridden(getClass())) {  
  375.                 security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);  
  376.             }  
  377.         }  
  378.   
  379.         g.addUnstarted();  
  380.   
  381.         this.group = g;  
  382.         this.daemon = parent.isDaemon();  
  383.         this.priority = parent.getPriority();  
  384.         this.name = name.toCharArray();  
  385.         if (security == null || isCCLOverridden(parent.getClass()))  
  386.             this.contextClassLoader = parent.getContextClassLoader();  
  387.         else  
  388.             this.contextClassLoader = parent.contextClassLoader;  
  389.         this.inheritedAccessControlContext = AccessController.getContext();  
  390.         this.target = target;  
  391.         setPriority(priority);  
  392.         if (parent.inheritableThreadLocals != null)  
  393.             this.inheritableThreadLocals =  
  394.                 ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);  
  395.         /* Stash the specified stack size in case the VM cares */  
  396.         this.stackSize = stackSize;  
  397.   
  398.         /* Set thread ID */  
  399.         tid = nextThreadID();  
  400.     }  
  401.   
  402.     /** 
  403.      * Throws CloneNotSupportedException as a Thread can not be meaningfully 
  404.      * cloned. Construct a new Thread instead. 
  405.      * 
  406.      * @throws  CloneNotSupportedException 
  407.      *          always 
  408.      */  
  409.     @Override  
  410.     protected Object clone() throws CloneNotSupportedException {  
  411.         throw new CloneNotSupportedException();  
  412.     }  
  413.   
  414.     /** 
  415.      * Allocates a new {@code Thread} object. This constructor has the same 
  416.      * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 
  417.      * {@code (null, null, gname)}, where {@code gname} is a newly generated 
  418.      * name. Automatically generated names are of the form 
  419.      * {@code "Thread-"+}n, where n is an integer. 
  420.      */  
  421.     public Thread() {  
  422.         init(null, null, "Thread-" + nextThreadNum(), 0);  
  423.     }  
  424.   
  425.     /** 
  426.      * Allocates a new {@code Thread} object. This constructor has the same 
  427.      * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 
  428.      * {@code (null, target, gname)}, where {@code gname} is a newly generated 
  429.      * name. Automatically generated names are of the form 
  430.      * {@code "Thread-"+}n, where n is an integer. 
  431.      * 
  432.      * @param  target 
  433.      *         the object whose {@code run} method is invoked when this thread 
  434.      *         is started. If {@code null}, this classes {@code run} method does 
  435.      *         nothing. 
  436.      */  
  437.     public Thread(Runnable target) {  
  438.         init(null, target, "Thread-" + nextThreadNum(), 0);  
  439.     }  
  440.   
  441.     /** 
  442.      * Allocates a new {@code Thread} object. This constructor has the same 
  443.      * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 
  444.      * {@code (group, target, gname)} ,where {@code gname} is a newly generated 
  445.      * name. Automatically generated names are of the form 
  446.      * {@code "Thread-"+}n, where n is an integer. 
  447.      * 
  448.      * @param  group 
  449.      *         the thread group. If {@code null} and there is a security 
  450.      *         manager, the group is determined by {@linkplain 
  451.      *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 
  452.      *         If there is not a security manager or {@code 
  453.      *         SecurityManager.getThreadGroup()} returns {@code null}, the group 
  454.      *         is set to the current thread's thread group. 
  455.      * 
  456.      * @param  target 
  457.      *         the object whose {@code run} method is invoked when this thread 
  458.      *         is started. If {@code null}, this thread's run method is invoked. 
  459.      * 
  460.      * @throws  SecurityException 
  461.      *          if the current thread cannot create a thread in the specified 
  462.      *          thread group 
  463.      */  
  464.     public Thread(ThreadGroup group, Runnable target) {  
  465.         init(group, target, "Thread-" + nextThreadNum(), 0);  
  466.     }  
  467.   
  468.     /** 
  469.      * Allocates a new {@code Thread} object. This constructor has the same 
  470.      * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 
  471.      * {@code (null, null, name)}. 
  472.      * 
  473.      * @param   name 
  474.      *          the name of the new thread 
  475.      */  
  476.     public Thread(String name) {  
  477.         init(null, null, name, 0);  
  478.     }  
  479.   
  480.     /** 
  481.      * Allocates a new {@code Thread} object. This constructor has the same 
  482.      * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 
  483.      * {@code (group, null, name)}. 
  484.      * 
  485.      * @param  group 
  486.      *         the thread group. If {@code null} and there is a security 
  487.      *         manager, the group is determined by {@linkplain 
  488.      *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 
  489.      *         If there is not a security manager or {@code 
  490.      *         SecurityManager.getThreadGroup()} returns {@code null}, the group 
  491.      *         is set to the current thread's thread group. 
  492.      * 
  493.      * @param  name 
  494.      *         the name of the new thread 
  495.      * 
  496.      * @throws  SecurityException 
  497.      *          if the current thread cannot create a thread in the specified 
  498.      *          thread group 
  499.      */  
  500.     public Thread(ThreadGroup group, String name) {  
  501.         init(group, null, name, 0);  
  502.     }  
  503.   
  504.     /** 
  505.      * Allocates a new {@code Thread} object. This constructor has the same 
  506.      * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} 
  507.      * {@code (null, target, name)}. 
  508.      * 
  509.      * @param  target 
  510.      *         the object whose {@code run} method is invoked when this thread 
  511.      *         is started. If {@code null}, this thread's run method is invoked. 
  512.      * 
  513.      * @param  name 
  514.      *         the name of the new thread 
  515.      */  
  516.     public Thread(Runnable target, String name) {  
  517.         init(null, target, name, 0);  
  518.     }  
  519.   
  520.     /** 
  521.      * Allocates a new {@code Thread} object so that it has {@code target} 
  522.      * as its run object, has the specified {@code name} as its name, 
  523.      * and belongs to the thread group referred to by {@code group}. 
  524.      * 
  525.      * 

    If there is a security manager, its 

  526.      * {@link SecurityManager#checkAccess(ThreadGroup) checkAccess} 
  527.      * method is invoked with the ThreadGroup as its argument. 
  528.      * 
  529.      * 

    In addition, its {@code checkPermission} method is invoked with 

  530.      * the {@code RuntimePermission("enableContextClassLoaderOverride")} 
  531.      * permission when invoked directly or indirectly by the constructor 
  532.      * of a subclass which overrides the {@code getContextClassLoader} 
  533.      * or {@code setContextClassLoader} methods. 
  534.      * 
  535.      * 

    The priority of the newly created thread is set equal to the 

  536.      * priority of the thread creating it, that is, the currently running 
  537.      * thread. The method {@linkplain #setPriority setPriority} may be 
  538.      * used to change the priority to a new value. 
  539.      * 
  540.      * 

    The newly created thread is initially marked as being a daemon 

  541.      * thread if and only if the thread creating it is currently marked 
  542.      * as a daemon thread. The method {@linkplain #setDaemon setDaemon} 
  543.      * may be used to change whether or not a thread is a daemon. 
  544.      * 
  545.      * @param  group 
  546.      *         the thread group. If {@code null} and there is a security 
  547.      *         manager, the group is determined by {@linkplain 
  548.      *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 
  549.      *         If there is not a security manager or {@code 
  550.      *         SecurityManager.getThreadGroup()} returns {@code null}, the group 
  551.      *         is set to the current thread's thread group. 
  552.      * 
  553.      * @param  target 
  554.      *         the object whose {@code run} method is invoked when this thread 
  555.      *         is started. If {@code null}, this thread's run method is invoked. 
  556.      * 
  557.      * @param  name 
  558.      *         the name of the new thread 
  559.      * 
  560.      * @throws  SecurityException 
  561.      *          if the current thread cannot create a thread in the specified 
  562.      *          thread group or cannot override the context class loader methods. 
  563.      */  
  564.     public Thread(ThreadGroup group, Runnable target, String name) {  
  565.         init(group, target, name, 0);  
  566.     }  
  567.   
  568.     /** 
  569.      * Allocates a new {@code Thread} object so that it has {@code target} 
  570.      * as its run object, has the specified {@code name} as its name, 
  571.      * and belongs to the thread group referred to by {@code group}, and has 
  572.      * the specified stack size
  573.      * 
  574.      * 

    This constructor is identical to {@link 

  575.      * #Thread(ThreadGroup,Runnable,String)} with the exception of the fact 
  576.      * that it allows the thread stack size to be specified.  The stack size 
  577.      * is the approximate number of bytes of address space that the virtual 
  578.      * machine is to allocate for this thread's stack.  The effect of the 
  579.      * {@code stackSize} parameter, if any, is highly platform dependent. 
  580.      * 
  581.      * 

    On some platforms, specifying a higher value for the 

  582.      * {@code stackSize} parameter may allow a thread to achieve greater 
  583.      * recursion depth before throwing a {@link StackOverflowError}. 
  584.      * Similarly, specifying a lower value may allow a greater number of 
  585.      * threads to exist concurrently without throwing an {@link 
  586.      * OutOfMemoryError} (or other internal error).  The details of 
  587.      * the relationship between the value of the stackSize parameter 
  588.      * and the maximum recursion depth and concurrency level are 
  589.      * platform-dependent.  On some platforms, the value of the 
  590.      * {@code stackSize} parameter may have no effect whatsoever. 
  591.      * 
  592.      * 

    The virtual machine is free to treat the {@code stackSize} 

  593.      * parameter as a suggestion.  If the specified value is unreasonably low 
  594.      * for the platform, the virtual machine may instead use some 
  595.      * platform-specific minimum value; if the specified value is unreasonably 
  596.      * high, the virtual machine may instead use some platform-specific 
  597.      * maximum.  Likewise, the virtual machine is free to round the specified 
  598.      * value up or down as it sees fit (or to ignore it completely). 
  599.      * 
  600.      * 

    Specifying a value of zero for the {@code stackSize} parameter will 

  601.      * cause this constructor to behave exactly like the 
  602.      * {@code Thread(ThreadGroup, Runnable, String)} constructor. 
  603.      * 
  604.      * 

    Due to the platform-dependent nature of the behavior of this 

  605.      * constructor, extreme care should be exercised in its use. 
  606.      * The thread stack size necessary to perform a given computation will 
  607.      * likely vary from one JRE implementation to another.  In light of this 
  608.      * variation, careful tuning of the stack size parameter may be required, 
  609.      * and the tuning may need to be repeated for each JRE implementation on 
  610.      * which an application is to run. 
  611.      * 
  612.      * 

    Implementation note: Java platform implementers are encouraged to 

  613.      * document their implementation's behavior with respect to the 
  614.      * {@code stackSize} parameter. 
  615.      * 
  616.      * 
  617.      * @param  group 
  618.      *         the thread group. If {@code null} and there is a security 
  619.      *         manager, the group is determined by {@linkplain 
  620.      *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}. 
  621.      *         If there is not a security manager or {@code 
  622.      *         SecurityManager.getThreadGroup()} returns {@code null}, the group 
  623.      *         is set to the current thread's thread group. 
  624.      * 
  625.      * @param  target 
  626.      *         the object whose {@code run} method is invoked when this thread 
  627.      *         is started. If {@code null}, this thread's run method is invoked. 
  628.      * 
  629.      * @param  name 
  630.      *         the name of the new thread 
  631.      * 
  632.      * @param  stackSize 
  633.      *         the desired stack size for the new thread, or zero to indicate 
  634.      *         that this parameter is to be ignored. 
  635.      * 
  636.      * @throws  SecurityException 
  637.      *          if the current thread cannot create a thread in the specified 
  638.      *          thread group 
  639.      * 
  640.      * @since 1.4 
  641.      */  
  642.     public Thread(ThreadGroup group, Runnable target, String name,  
  643.                   long stackSize) {  
  644.         init(group, target, name, stackSize);  
  645.     }  
  646.   
  647.     /** 
  648.      * Causes this thread to begin execution; the Java Virtual Machine 
  649.      * calls the run method of this thread. 
  650.      * 

     

  651.      * The result is that two threads are running concurrently: the 
  652.      * current thread (which returns from the call to the 
  653.      * start method) and the other thread (which executes its 
  654.      * run method). 
  655.      * 

     

  656.      * It is never legal to start a thread more than once. 
  657.      * In particular, a thread may not be restarted once it has completed 
  658.      * execution. 
  659.      * 
  660.      * @exception  IllegalThreadStateException  if the thread was already 
  661.      *               started. 
  662.      * @see        #run() 
  663.      * @see        #stop() 
  664.      */  
  665.     public synchronized void start() {  
  666.         /** 
  667.          * This method is not invoked for the main method thread or "system" 
  668.          * group threads created/set up by the VM. Any new functionality added 
  669.          * to this method in the future may have to also be added to the VM. 
  670.          * 
  671.          * A zero status value corresponds to state "NEW". 
  672.          */  
  673.         if (threadStatus != 0)  
  674.             throw new IllegalThreadStateException();  
  675.   
  676.         /* Notify the group that this thread is about to be started 
  677.          * so that it can be added to the group's list of threads 
  678.          * and the group's unstarted count can be decremented. */  
  679.         group.add(this);  
  680.   
  681.         boolean started = false;  
  682.         try {  
  683.             start0();  
  684.             started = true;  
  685.         } finally {  
  686.             try {  
  687.                 if (!started) {  
  688.                     group.threadStartFailed(this);  
  689.                 }  
  690.             } catch (Throwable ignore) {  
  691.                 /* do nothing. If start0 threw a Throwable then 
  692.                   it will be passed up the call stack */  
  693.             }  
  694.         }  
  695.     }  
  696.   
  697.     private native void start0();  
  698.   
  699.     /** 
  700.      * If this thread was constructed using a separate 
  701.      * Runnable run object, then that 
  702.      * Runnable object's run method is called; 
  703.      * otherwise, this method does nothing and returns. 
  704.      * 

     

  705.      * Subclasses of Thread should override this method. 
  706.      * 
  707.      * @see     #start() 
  708.      * @see     #stop() 
  709.      * @see     #Thread(ThreadGroup, Runnable, String) 
  710.      */  
  711.     @Override  
  712.     public void run() {  
  713.         if (target != null) {  
  714.             target.run();  
  715.         }  
  716.     }  
  717.   
  718.     /** 
  719.      * This method is called by the system to give a Thread 
  720.      * a chance to clean up before it actually exits. 
  721.      */  
  722.     private void exit() {  
  723.         if (group != null) {  
  724.             group.threadTerminated(this);  
  725.             group = null;  
  726.         }  
  727.         /* Aggressively null out all reference fields: see bug 4006245 */  
  728.         target = null;  
  729.         /* Speed the release of some of these resources */  
  730.         threadLocals = null;  
  731.         inheritableThreadLocals = null;  
  732.         inheritedAccessControlContext = null;  
  733.         blocker = null;  
  734.         uncaughtExceptionHandler = null;  
  735.     }  
  736.   
  737.     /** 
  738.      * Forces the thread to stop executing. 
  739.      * 

     

  740.      * If there is a security manager installed, its checkAccess 
  741.      * method is called with this 
  742.      * as its argument. This may result in a 
  743.      * SecurityException being raised (in the current thread). 
  744.      * 

     

  745.      * If this thread is different from the current thread (that is, the current 
  746.      * thread is trying to stop a thread other than itself), the 
  747.      * security manager's checkPermission method (with a 
  748.      * RuntimePermission("stopThread") argument) is called in 
  749.      * addition. 
  750.      * Again, this may result in throwing a 
  751.      * SecurityException (in the current thread). 
  752.      * 

     

  753.      * The thread represented by this thread is forced to stop whatever 
  754.      * it is doing abnormally and to throw a newly created 
  755.      * ThreadDeath object as an exception. 
  756.      * 

     

  757.      * It is permitted to stop a thread that has not yet been started. 
  758.      * If the thread is eventually started, it immediately terminates. 
  759.      * 

     

  760.      * An application should not normally try to catch 
  761.      * ThreadDeath unless it must do some extraordinary 
  762.      * cleanup operation (note that the throwing of 
  763.      * ThreadDeath causes finally clauses of 
  764.      * try statements to be executed before the thread 
  765.      * officially dies).  If a catch clause catches a 
  766.      * ThreadDeath object, it is important to rethrow the 
  767.      * object so that the thread actually dies. 
  768.      * 

     

  769.      * The top-level error handler that reacts to otherwise uncaught 
  770.      * exceptions does not print out a message or otherwise notify the 
  771.      * application if the uncaught exception is an instance of 
  772.      * ThreadDeath
  773.      * 
  774.      * @exception  SecurityException  if the current thread cannot 
  775.      *               modify this thread. 
  776.      * @see        #interrupt() 
  777.      * @see        #checkAccess() 
  778.      * @see        #run() 
  779.      * @see        #start() 
  780.      * @see        ThreadDeath 
  781.      * @see        ThreadGroup#uncaughtException(Thread,Throwable) 
  782.      * @see        SecurityManager#checkAccess(Thread) 
  783.      * @see        SecurityManager#checkPermission 
  784.      * @deprecated This method is inherently unsafe.  Stopping a thread with 
  785.      *       Thread.stop causes it to unlock all of the monitors that it 
  786.      *       has locked (as a natural consequence of the unchecked 
  787.      *       ThreadDeath exception propagating up the stack).  If 
  788.      *       any of the objects previously protected by these monitors were in 
  789.      *       an inconsistent state, the damaged objects become visible to 
  790.      *       other threads, potentially resulting in arbitrary behavior.  Many 
  791.      *       uses of stop should be replaced by code that simply 
  792.      *       modifies some variable to indicate that the target thread should 
  793.      *       stop running.  The target thread should check this variable 
  794.      *       regularly, and return from its run method in an orderly fashion 
  795.      *       if the variable indicates that it is to stop running.  If the 
  796.      *       target thread waits for long periods (on a condition variable, 
  797.      *       for example), the interrupt method should be used to 
  798.      *       interrupt the wait. 
  799.      *       For more information, see 
  800.      *       Why 
  801.      *       are Thread.stop, Thread.suspend and Thread.resume Deprecated?. 
  802.      */  
  803.     @Deprecated  
  804.     public final void stop() {  
  805.         stop(new ThreadDeath());  
  806.     }  
  807.   
  808.     /** 
  809.      * Forces the thread to stop executing. 
  810.      * 

     

  811.      * If there is a security manager installed, the checkAccess 
  812.      * method of this thread is called, which may result in a 
  813.      * SecurityException being raised (in the current thread). 
  814.      * 

     

  815.      * If this thread is different from the current thread (that is, the current 
  816.      * thread is trying to stop a thread other than itself) or 
  817.      * obj is not an instance of ThreadDeath, the 
  818.      * security manager's checkPermission method (with the 
  819.      * RuntimePermission("stopThread") argument) is called in 
  820.      * addition. 
  821.      * Again, this may result in throwing a 
  822.      * SecurityException (in the current thread). 
  823.      * 

     

  824.      * If the argument obj is null, a 
  825.      * NullPointerException is thrown (in the current thread). 
  826.      * 

     

  827.      * The thread represented by this thread is forced to stop 
  828.      * whatever it is doing abnormally and to throw the 
  829.      * Throwable object obj as an exception. This 
  830.      * is an unusual action to take; normally, the stop method 
  831.      * that takes no arguments should be used. 
  832.      * 

     

  833.      * It is permitted to stop a thread that has not yet been started. 
  834.      * If the thread is eventually started, it immediately terminates. 
  835.      * 
  836.      * @param      obj   the Throwable object to be thrown. 
  837.      * @exception  SecurityException  if the current thread cannot modify 
  838.      *               this thread. 
  839.      * @throws     NullPointerException if obj is null
  840.      * @see        #interrupt() 
  841.      * @see        #checkAccess() 
  842.      * @see        #run() 
  843.      * @see        #start() 
  844.      * @see        #stop() 
  845.      * @see        SecurityManager#checkAccess(Thread) 
  846.      * @see        SecurityManager#checkPermission 
  847.      * @deprecated This method is inherently unsafe.  See {@link #stop()} 
  848.      *        for details.  An additional danger of this 
  849.      *        method is that it may be used to generate exceptions that the 
  850.      *        target thread is unprepared to handle (including checked 
  851.      *        exceptions that the thread could not possibly throw, were it 
  852.      *        not for this method). 
  853.      *        For more information, see 
  854.      *        Why 
  855.      *        are Thread.stop, Thread.suspend and Thread.resume Deprecated?. 
  856.      */  
  857.     @Deprecated  
  858.     public final synchronized void stop(Throwable obj) {  
  859.         if (obj == null)  
  860.             throw new NullPointerException();  
  861.   
  862.         SecurityManager security = System.getSecurityManager();  
  863.         if (security != null) {  
  864.             checkAccess();  
  865.             if ((this != Thread.currentThread()) ||  
  866.                 (!(obj instanceof ThreadDeath))) {  
  867.                 security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION);  
  868.             }  
  869.         }  
  870.         // A zero status value corresponds to "NEW", it can't change to  
  871.         // not-NEW because we hold the lock.  
  872.         if (threadStatus != 0) {  
  873.             resume(); // Wake up thread if it was suspended; no-op otherwise  
  874.         }  
  875.   
  876.         // The VM can handle all thread states  
  877.         stop0(obj);  
  878.     }  
  879.   
  880.     /** 
  881.      * Interrupts this thread. 
  882.      * 
  883.      * 

     Unless the current thread is interrupting itself, which is 

  884.      * always permitted, the {@link #checkAccess() checkAccess} method 
  885.      * of this thread is invoked, which may cause a {@link 
  886.      * SecurityException} to be thrown. 
  887.      * 
  888.      * 

     If this thread is blocked in an invocation of the {@link 

  889.      * Object#wait() wait()}, {@link Object#wait(long) wait(long)}, or {@link 
  890.      * Object#wait(long, int) wait(long, int)} methods of the {@link Object} 
  891.      * class, or of the {@link #join()}, {@link #join(long)}, {@link 
  892.      * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)}, 
  893.      * methods of this class, then its interrupt status will be cleared and it 
  894.      * will receive an {@link InterruptedException}. 
  895.      * 
  896.      * 

     If this thread is blocked in an I/O operation upon an {@link 

  897.      * java.nio.channels.InterruptibleChannel interruptible 
  898.      * channel} then the channel will be closed, the thread's interrupt 
  899.      * status will be set, and the thread will receive a {@link 
  900.      * java.nio.channels.ClosedByInterruptException}. 
  901.      * 
  902.      * 

     If this thread is blocked in a {@link java.nio.channels.Selector} 

  903.      * then the thread's interrupt status will be set and it will return 
  904.      * immediately from the selection operation, possibly with a non-zero 
  905.      * value, just as if the selector's {@link 
  906.      * java.nio.channels.Selector#wakeup wakeup} method were invoked. 
  907.      * 
  908.      * 

     If none of the previous conditions hold then this thread's interrupt 

  909.      * status will be set. 

     
  910.      * 
  911.      * 

     Interrupting a thread that is not alive need not have any effect. 

  912.      * 
  913.      * @throws  SecurityException 
  914.      *          if the current thread cannot modify this thread 
  915.      * 
  916.      * @revised 6.0 
  917.      * @spec JSR-51 
  918.      */  
  919.     public void interrupt() {  
  920.         if (this != Thread.currentThread())  
  921.             checkAccess();  
  922.   
  923.         synchronized (blockerLock) {  
  924.             Interruptible b = blocker;  
  925.             if (b != null) {  
  926.                 interrupt0();           // Just to set the interrupt flag  
  927.                 b.interrupt(this);  
  928.                 return;  
  929.             }  
  930.         }  
  931.         interrupt0();  
  932.     }  
  933.   
  934.     /** 
  935.      * Tests whether the current thread has been interrupted.  The 
  936.      * interrupted status of the thread is cleared by this method.  In 
  937.      * other words, if this method were to be called twice in succession, the 
  938.      * second call would return false (unless the current thread were 
  939.      * interrupted again, after the first call had cleared its interrupted 
  940.      * status and before the second call had examined it). 
  941.      * 
  942.      * 

    A thread interruption ignored because a thread was not alive 

  943.      * at the time of the interrupt will be reflected by this method 
  944.      * returning false. 
  945.      * 
  946.      * @return  true if the current thread has been interrupted; 
  947.      *          false otherwise. 
  948.      * @see #isInterrupted() 
  949.      * @revised 6.0 
  950.      */  
  951.     public static boolean interrupted() {  
  952.         return currentThread().isInterrupted(true);  
  953.     }  
  954.   
  955.     /** 
  956.      * Tests whether this thread has been interrupted.  The interrupted 
  957.      * status of the thread is unaffected by this method. 
  958.      * 
  959.      * 

    A thread interruption ignored because a thread was not alive 

  960.      * at the time of the interrupt will be reflected by this method 
  961.      * returning false. 
  962.      * 
  963.      * @return  true if this thread has been interrupted; 
  964.      *          false otherwise. 
  965.      * @see     #interrupted() 
  966.      * @revised 6.0 
  967.      */  
  968.     public boolean isInterrupted() {  
  969.         return isInterrupted(false);  
  970.     }  
  971.   
  972.     /** 
  973.      * Tests if some Thread has been interrupted.  The interrupted state 
  974.      * is reset or not based on the value of ClearInterrupted that is 
  975.      * passed. 
  976.      */  
  977.     private native boolean isInterrupted(boolean ClearInterrupted);  
  978.   
  979.     /** 
  980.      * Throws {@link NoSuchMethodError}. 
  981.      * 
  982.      * @deprecated This method was originally designed to destroy this 
  983.      *     thread without any cleanup. Any monitors it held would have 
  984.      *     remained locked. However, the method was never implemented. 
  985.      *     If if were to be implemented, it would be deadlock-prone in 
  986.      *     much the manner of {@link #suspend}. If the target thread held 
  987.      *     a lock protecting a critical system resource when it was 
  988.      *     destroyed, no thread could ever access this resource again. 
  989.      *     If another thread ever attempted to lock this resource, deadlock 
  990.      *     would result. Such deadlocks typically manifest themselves as 
  991.      *     "frozen" processes. For more information, see 
  992.      *      
  993.      *     Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?. 
  994.      * @throws NoSuchMethodError always 
  995.      */  
  996.     @Deprecated  
  997.     public void destroy() {  
  998.         throw new NoSuchMethodError();  
  999.     }  
  1000.   
  1001.     /** 
  1002.      * Tests if this thread is alive. A thread is alive if it has 
  1003.      * been started and has not yet died. 
  1004.      * 
  1005.      * @return  true if this thread is alive; 
  1006.      *          false otherwise. 
  1007.      */  
  1008.     public final native boolean isAlive();  
  1009.   
  1010.     /** 
  1011.      * Suspends this thread. 
  1012.      * 

     

  1013.      * First, the checkAccess method of this thread is called 
  1014.      * with no arguments. This may result in throwing a 
  1015.      * SecurityException (in the current thread). 
  1016.      * 

     

  1017.      * If the thread is alive, it is suspended and makes no further 
  1018.      * progress unless and until it is resumed. 
  1019.      * 
  1020.      * @exception  SecurityException  if the current thread cannot modify 
  1021.      *               this thread. 
  1022.      * @see #checkAccess 
  1023.      * @deprecated   This method has been deprecated, as it is 
  1024.      *   inherently deadlock-prone.  If the target thread holds a lock on the 
  1025.      *   monitor protecting a critical system resource when it is suspended, no 
  1026.      *   thread can access this resource until the target thread is resumed. If 
  1027.      *   the thread that would resume the target thread attempts to lock this 
  1028.      *   monitor prior to calling resume, deadlock results.  Such 
  1029.      *   deadlocks typically manifest themselves as "frozen" processes. 
  1030.      *   For more information, see 
  1031.      *   Why 
  1032.      *   are Thread.stop, Thread.suspend and Thread.resume Deprecated?. 
  1033.      */  
  1034.     @Deprecated  
  1035.     public final void suspend() {  
  1036.         checkAccess();  
  1037.         suspend0();  
  1038.     }  
  1039.   
  1040.     /** 
  1041.      * Resumes a suspended thread. 
  1042.      * 

     

  1043.      * First, the checkAccess method of this thread is called 
  1044.      * with no arguments. This may result in throwing a 
  1045.      * SecurityException (in the current thread). 
  1046.      * 

     

  1047.      * If the thread is alive but suspended, it is resumed and is 
  1048.      * permitted to make progress in its execution. 
  1049.      * 
  1050.      * @exception  SecurityException  if the current thread cannot modify this 
  1051.      *               thread. 
  1052.      * @see        #checkAccess 
  1053.      * @see        #suspend() 
  1054.      * @deprecated This method exists solely for use with {@link #suspend}, 
  1055.      *     which has been deprecated because it is deadlock-prone. 
  1056.      *     For more information, see 
  1057.      *     Why 
  1058.      *     are Thread.stop, Thread.suspend and Thread.resume Deprecated?. 
  1059.      */  
  1060.     @Deprecated  
  1061.     public final void resume() {  
  1062.         checkAccess();  
  1063.         resume0();  
  1064.     }  
  1065.   
  1066.     /** 
  1067.      * Changes the priority of this thread. 
  1068.      * 

     

  1069.      * First the checkAccess method of this thread is called 
  1070.      * with no arguments. This may result in throwing a 
  1071.      * SecurityException
  1072.      * 

     

  1073.      * Otherwise, the priority of this thread is set to the smaller of 
  1074.      * the specified newPriority and the maximum permitted 
  1075.      * priority of the thread's thread group. 
  1076.      * 
  1077.      * @param newPriority priority to set this thread to 
  1078.      * @exception  IllegalArgumentException  If the priority is not in the 
  1079.      *               range MIN_PRIORITY to 
  1080.      *               MAX_PRIORITY
  1081.      * @exception  SecurityException  if the current thread cannot modify 
  1082.      *               this thread. 
  1083.      * @see        #getPriority 
  1084.      * @see        #checkAccess() 
  1085.      * @see        #getThreadGroup() 
  1086.      * @see        #MAX_PRIORITY 
  1087.      * @see        #MIN_PRIORITY 
  1088.      * @see        ThreadGroup#getMaxPriority() 
  1089.      */  
  1090.     public final void setPriority(int newPriority) {  
  1091.         ThreadGroup g;  
  1092.         checkAccess();  
  1093.         if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {  
  1094.             throw new IllegalArgumentException();  
  1095.         }  
  1096.         if((g = getThreadGroup()) != null) {  
  1097.             if (newPriority > g.getMaxPriority()) {  
  1098.                 newPriority = g.getMaxPriority();  
  1099.             }  
  1100.             setPriority0(priority = newPriority);  
  1101.         }  
  1102.     }  
  1103.   
  1104.     /** 
  1105.      * Returns this thread's priority. 
  1106.      * 
  1107.      * @return  this thread's priority. 
  1108.      * @see     #setPriority 
  1109.      */  
  1110.     public final int getPriority() {  
  1111.         return priority;  
  1112.     }  
  1113.   
  1114.     /** 
  1115.      * Changes the name of this thread to be equal to the argument 
  1116.      * name
  1117.      * 

     

  1118.      * First the checkAccess method of this thread is called 
  1119.      * with no arguments. This may result in throwing a 
  1120.      * SecurityException
  1121.      * 
  1122.      * @param      name   the new name for this thread. 
  1123.      * @exception  SecurityException  if the current thread cannot modify this 
  1124.      *               thread. 
  1125.      * @see        #getName 
  1126.      * @see        #checkAccess() 
  1127.      */  
  1128.     public final void setName(String name) {  
  1129.         checkAccess();  
  1130.         this.name = name.toCharArray();  
  1131.     }  
  1132.   
  1133.     /** 
  1134.      * Returns this thread's name. 
  1135.      * 
  1136.      * @return  this thread's name. 
  1137.      * @see     #setName(String) 
  1138.      */  
  1139.     public final String getName() {  
  1140.         return String.valueOf(name);  
  1141.     }  
  1142.   
  1143.     /** 
  1144.      * Returns the thread group to which this thread belongs. 
  1145.      * This method returns null if this thread has died 
  1146.      * (been stopped). 
  1147.      * 
  1148.      * @return  this thread's thread group. 
  1149.      */  
  1150.     public final ThreadGroup getThreadGroup() {  
  1151.         return group;  
  1152.     }  
  1153.   
  1154.     /** 
  1155.      * Returns an estimate of the number of active threads in the current 
  1156.      * thread's {@linkplain java.lang.ThreadGroup thread group} and its 
  1157.      * subgroups. Recursively iterates over all subgroups in the current 
  1158.      * thread's thread group. 
  1159.      * 
  1160.      * 

     The value returned is only an estimate because the number of 

  1161.      * threads may change dynamically while this method traverses internal 
  1162.      * data structures, and might be affected by the presence of certain 
  1163.      * system threads. This method is intended primarily for debugging 
  1164.      * and monitoring purposes. 
  1165.      * 
  1166.      * @return  an estimate of the number of active threads in the current 
  1167.      *          thread's thread group and in any other thread group that 
  1168.      *          has the current thread's thread group as an ancestor 
  1169.      */  
  1170.     public static int activeCount() {  
  1171.         return currentThread().getThreadGroup().activeCount();  
  1172.     }  
  1173.   
  1174.     /** 
  1175.      * Copies into the specified array every active thread in the current 
  1176.      * thread's thread group and its subgroups. This method simply 
  1177.      * invokes the {@link java.lang.ThreadGroup#enumerate(Thread[])} 
  1178.      * method of the current thread's thread group. 
  1179.      * 
  1180.      * 

     An application might use the {@linkplain #activeCount activeCount} 

  1181.      * method to get an estimate of how big the array should be, however 
  1182.      * if the array is too short to hold all the threads, the extra threads 
  1183.      * are silently ignored.  If it is critical to obtain every active 
  1184.      * thread in the current thread's thread group and its subgroups, the 
  1185.      * invoker should verify that the returned int value is strictly less 
  1186.      * than the length of {@code tarray}. 
  1187.      * 
  1188.      * 

     Due to the inherent race condition in this method, it is recommended 

  1189.      * that the method only be used for debugging and monitoring purposes. 
  1190.      * 
  1191.      * @param  tarray 
  1192.      *         an array into which to put the list of threads 
  1193.      * 
  1194.      * @return  the number of threads put into the array 
  1195.      * 
  1196.      * @throws  SecurityException 
  1197.      *          if {@link java.lang.ThreadGroup#checkAccess} determines that 
  1198.      *          the current thread cannot access its thread group 
  1199.      */  
  1200.     public static int enumerate(Thread tarray[]) {  
  1201.         return currentThread().getThreadGroup().enumerate(tarray);  
  1202.     }  
  1203.   
  1204.     /** 
  1205.      * Counts the number of stack frames in this thread. The thread must 
  1206.      * be suspended. 
  1207.      * 
  1208.      * @return     the number of stack frames in this thread. 
  1209.      * @exception  IllegalThreadStateException  if this thread is not 
  1210.      *             suspended. 
  1211.      * @deprecated The definition of this call depends on {@link #suspend}, 
  1212.      *             which is deprecated.  Further, the results of this call 
  1213.      *             were never well-defined. 
  1214.      */  
  1215.     @Deprecated  
  1216.     public native int countStackFrames();  
  1217.   
  1218.     /** 
  1219.      * Waits at most {@code millis} milliseconds for this thread to 
  1220.      * die. A timeout of {@code 0} means to wait forever. 
  1221.      * 
  1222.      * 

     This implementation uses a loop of {@code this.wait} calls 

  1223.      * conditioned on {@code this.isAlive}. As a thread terminates the 
  1224.      * {@code this.notifyAll} method is invoked. It is recommended that 
  1225.      * applications not use {@code wait}, {@code notify}, or 
  1226.      * {@code notifyAll} on {@code Thread} instances. 
  1227.      * 
  1228.      * @param  millis 
  1229.      *         the time to wait in milliseconds 
  1230.      * 
  1231.      * @throws  IllegalArgumentException 
  1232.      *          if the value of {@code millis} is negative 
  1233.      * 
  1234.      * @throws  InterruptedException 
  1235.      *          if any thread has interrupted the current thread. The 
  1236.      *          interrupted status of the current thread is 
  1237.      *          cleared when this exception is thrown. 
  1238.      */  
  1239.     public final synchronized void join(long millis)  
  1240.     throws InterruptedException {  
  1241.         long base = System.currentTimeMillis();  
  1242.         long now = 0;  
  1243.   
  1244.         if (millis < 0) {  
  1245.             throw new IllegalArgumentException("timeout value is negative");  
  1246.         }  
  1247.   
  1248.         if (millis == 0) {  
  1249.             while (isAlive()) {  
  1250.                 wait(0);  
  1251.             }  
  1252.         } else {  
  1253.             while (isAlive()) {  
  1254.                 long delay = millis - now;  
  1255.                 if (delay <= 0) {  
  1256.                     break;  
  1257.                 }  
  1258.                 wait(delay);  
  1259.                 now = System.currentTimeMillis() - base;  
  1260.             }  
  1261.         }  
  1262.     }  
  1263.   
  1264.     /** 
  1265.      * Waits at most {@code millis} milliseconds plus 
  1266.      * {@code nanos} nanoseconds for this thread to die. 
  1267.      * 
  1268.      * 

     This implementation uses a loop of {@code this.wait} calls 

  1269.      * conditioned on {@code this.isAlive}. As a thread terminates the 
  1270.      * {@code this.notifyAll} method is invoked. It is recommended that 
  1271.      * applications not use {@code wait}, {@code notify}, or 
  1272.      * {@code notifyAll} on {@code Thread} instances. 
  1273.      * 
  1274.      * @param  millis 
  1275.      *         the time to wait in milliseconds 
  1276.      * 
  1277.      * @param  nanos 
  1278.      *         {@code 0-999999} additional nanoseconds to wait 
  1279.      * 
  1280.      * @throws  IllegalArgumentException 
  1281.      *          if the value of {@code millis} is negative, or the value 
  1282.      *          of {@code nanos} is not in the range {@code 0-999999} 
  1283.      * 
  1284.      * @throws  InterruptedException 
  1285.      *          if any thread has interrupted the current thread. The 
  1286.      *          interrupted status of the current thread is 
  1287.      *          cleared when this exception is thrown. 
  1288.      */  
  1289.     public final synchronized void join(long millis, int nanos)  
  1290.     throws InterruptedException {  
  1291.   
  1292.         if (millis < 0) {  
  1293.             throw new IllegalArgumentException("timeout value is negative");  
  1294.         }  
  1295.   
  1296.         if (nanos < 0 || nanos > 999999) {  
  1297.             throw new IllegalArgumentException(  
  1298.                                 "nanosecond timeout value out of range");  
  1299.         }  
  1300.   
  1301.         if (nanos >= 500000 || (nanos != 0 && millis == 0)) {  
  1302.             millis++;  
  1303.         }  
  1304.   
  1305.         join(millis);  
  1306.     }  
  1307.   
  1308.     /** 
  1309.      * Waits for this thread to die. 
  1310.      * 
  1311.      * 

     An invocation of this method behaves in exactly the same 

  1312.      * way as the invocation 
  1313.      * 
  1314.      * 
     
  1315.      * {@linkplain #join(long) join}{@code (0)} 
  1316.      *  
  1317.      * 
  1318.      * @throws  InterruptedException 
  1319.      *          if any thread has interrupted the current thread. The 
  1320.      *          interrupted status of the current thread is 
  1321.      *          cleared when this exception is thrown. 
  1322.      */  
  1323.     public final void join() throws InterruptedException {  
  1324.         join(0);  
  1325.     }  
  1326.   
  1327.     /** 
  1328.      * Prints a stack trace of the current thread to the standard error stream. 
  1329.      * This method is used only for debugging. 
  1330.      * 
  1331.      * @see     Throwable#printStackTrace() 
  1332.      */  
  1333.     public static void dumpStack() {  
  1334.         new Exception("Stack trace").printStackTrace();  
  1335.     }  
  1336.   
  1337.     /** 
  1338.      * Marks this thread as either a {@linkplain #isDaemon daemon} thread 
  1339.      * or a user thread. The Java Virtual Machine exits when the only 
  1340.      * threads running are all daemon threads. 
  1341.      * 
  1342.      * 

     This method must be invoked before the thread is started. 

  1343.      * 
  1344.      * @param  on 
  1345.      *         if {@code true}, marks this thread as a daemon thread 
  1346.      * 
  1347.      * @throws  IllegalThreadStateException 
  1348.      *          if this thread is {@linkplain #isAlive alive} 
  1349.      * 
  1350.      * @throws  SecurityException 
  1351.      *          if {@link #checkAccess} determines that the current 
  1352.      *          thread cannot modify this thread 
  1353.      */  
  1354.     public final void setDaemon(boolean on) {  
  1355.         checkAccess();  
  1356.         if (isAlive()) {  
  1357.             throw new IllegalThreadStateException();  
  1358.         }  
  1359.         daemon = on;  
  1360.     }  
  1361.   
  1362.     /** 
  1363.      * Tests if this thread is a daemon thread. 
  1364.      * 
  1365.      * @return  true if this thread is a daemon thread; 
  1366.      *          false otherwise. 
  1367.      * @see     #setDaemon(boolean) 
  1368.      */  
  1369.     public final boolean isDaemon() {  
  1370.         return daemon;  
  1371.     }  
  1372.   
  1373.     /** 
  1374.      * Determines if the currently running thread has permission to 
  1375.      * modify this thread. 
  1376.      * 

     

  1377.      * If there is a security manager, its checkAccess method 
  1378.      * is called with this thread as its argument. This may result in 
  1379.      * throwing a SecurityException
  1380.      * 
  1381.      * @exception  SecurityException  if the current thread is not allowed to 
  1382.      *               access this thread. 
  1383.      * @see        SecurityManager#checkAccess(Thread) 
  1384.      */  
  1385.     public final void checkAccess() {  
  1386.         SecurityManager security = System.getSecurityManager();  
  1387.         if (security != null) {  
  1388.             security.checkAccess(this);  
  1389.         }  
  1390.     }  
  1391.   
  1392.     /** 
  1393.      * Returns a string representation of this thread, including the 
  1394.      * thread's name, priority, and thread group. 
  1395.      * 
  1396.      * @return  a string representation of this thread. 
  1397.      */  
  1398.     public String toString() {  
  1399.         ThreadGroup group = getThreadGroup();  
  1400.         if (group != null) {  
  1401.             return "Thread[" + getName() + "," + getPriority() + "," +  
  1402.                            group.getName() + "]";  
  1403.         } else {  
  1404.             return "Thread[" + getName() + "," + getPriority() + "," +  
  1405.                             "" + "]";  
  1406.         }  
  1407.     }  
  1408.   
  1409.     /** 
  1410.      * Returns the context ClassLoader for this Thread. The context 
  1411.      * ClassLoader is provided by the creator of the thread for use 
  1412.      * by code running in this thread when loading classes and resources. 
  1413.      * If not {@linkplain #setContextClassLoader set}, the default is the 
  1414.      * ClassLoader context of the parent Thread. The context ClassLoader of the 
  1415.      * primordial thread is typically set to the class loader used to load the 
  1416.      * application. 
  1417.      * 
  1418.      * 

    If a security manager is present, and the invoker's class loader is not 

  1419.      * {@code null} and is not the same as or an ancestor of the context class 
  1420.      * loader, then this method invokes the security manager's {@link 
  1421.      * SecurityManager#checkPermission(java.security.Permission) checkPermission} 
  1422.      * method with a {@link RuntimePermission RuntimePermission}{@code 
  1423.      * ("getClassLoader")} permission to verify that retrieval of the context 
  1424.      * class loader is permitted. 
  1425.      * 
  1426.      * @return  the context ClassLoader for this Thread, or {@code null} 
  1427.      *          indicating the system class loader (or, failing that, the 
  1428.      *          bootstrap class loader) 
  1429.      * 
  1430.      * @throws  SecurityException 
  1431.      *          if the current thread cannot get the context ClassLoader 
  1432.      * 
  1433.      * @since 1.2 
  1434.      */  
  1435.     public ClassLoader getContextClassLoader() {  
  1436.         if (contextClassLoader == null)  
  1437.             return null;  
  1438.         SecurityManager sm = System.getSecurityManager();  
  1439.         if (sm != null) {  
  1440.             ClassLoader ccl = ClassLoader.getCallerClassLoader();  
  1441.             if (ccl != null && ccl != contextClassLoader &&  
  1442.                     !contextClassLoader.isAncestor(ccl)) {  
  1443.                 sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);  
  1444.             }  
  1445.         }  
  1446.         return contextClassLoader;  
  1447.     }  
  1448.   
  1449.     /** 
  1450.      * Sets the context ClassLoader for this Thread. The context 
  1451.      * ClassLoader can be set when a thread is created, and allows 
  1452.      * the creator of the thread to provide the appropriate class loader, 
  1453.      * through {@code getContextClassLoader}, to code running in the thread 
  1454.      * when loading classes and resources. 
  1455.      * 
  1456.      * 

    If a security manager is present, its {@link 

  1457.      * SecurityManager#checkPermission(java.security.Permission) checkPermission} 
  1458.      * method is invoked with a {@link RuntimePermission RuntimePermission}{@code 
  1459.      * ("setContextClassLoader")} permission to see if setting the context 
  1460.      * ClassLoader is permitted. 
  1461.      * 
  1462.      * @param  cl 
  1463.      *         the context ClassLoader for this Thread, or null  indicating the 
  1464.      *         system class loader (or, failing that, the bootstrap class loader) 
  1465.      * 
  1466.      * @throws  SecurityException 
  1467.      *          if the current thread cannot set the context ClassLoader 
  1468.      * 
  1469.      * @since 1.2 
  1470.      */  
  1471.     public void setContextClassLoader(ClassLoader cl) {  
  1472.         SecurityManager sm = System.getSecurityManager();  
  1473.         if (sm != null) {  
  1474.             sm.checkPermission(new RuntimePermission("setContextClassLoader"));  
  1475.         }  
  1476.         contextClassLoader = cl;  
  1477.     }  
  1478.   
  1479.     /** 
  1480.      * Returns true if and only if the current thread holds the 
  1481.      * monitor lock on the specified object. 
  1482.      * 
  1483.      * 

    This method is designed to allow a program to assert that 

  1484.      * the current thread already holds a specified lock: 
  1485.      * 
     
  1486.      *     assert Thread.holdsLock(obj); 
  1487.      *  
  1488.      * 
  1489.      * @param  obj the object on which to test lock ownership 
  1490.      * @throws NullPointerException if obj is null 
  1491.      * @return true if the current thread holds the monitor lock on 
  1492.      *         the specified object. 
  1493.      * @since 1.4 
  1494.      */  
  1495.     public static native boolean holdsLock(Object obj);  
  1496.   
  1497.     private static final StackTraceElement[] EMPTY_STACK_TRACE  
  1498.         = new StackTraceElement[0];  
  1499.   
  1500.     /** 
  1501.      * Returns an array of stack trace elements representing the stack dump 
  1502.      * of this thread.  This method will return a zero-length array if 
  1503.      * this thread has not started, has started but has not yet been 
  1504.      * scheduled to run by the system, or has terminated. 
  1505.      * If the returned array is of non-zero length then the first element of 
  1506.      * the array represents the top of the stack, which is the most recent 
  1507.      * method invocation in the sequence.  The last element of the array 
  1508.      * represents the bottom of the stack, which is the least recent method 
  1509.      * invocation in the sequence. 
  1510.      * 
  1511.      * 

    If there is a security manager, and this thread is not 

  1512.      * the current thread, then the security manager's 
  1513.      * checkPermission method is called with a 
  1514.      * RuntimePermission("getStackTrace") permission 
  1515.      * to see if it's ok to get the stack trace. 
  1516.      * 
  1517.      * 

    Some virtual machines may, under some circumstances, omit one 

  1518.      * or more stack frames from the stack trace.  In the extreme case, 
  1519.      * a virtual machine that has no stack trace information concerning 
  1520.      * this thread is permitted to return a zero-length array from this 
  1521.      * method. 
  1522.      * 
  1523.      * @return an array of StackTraceElement
  1524.      * each represents one stack frame. 
  1525.      * 
  1526.      * @throws SecurityException 
  1527.      *        if a security manager exists and its 
  1528.      *        checkPermission method doesn't allow 
  1529.      *        getting the stack trace of thread. 
  1530.      * @see SecurityManager#checkPermission 
  1531.      * @see RuntimePermission 
  1532.      * @see Throwable#getStackTrace 
  1533.      * 
  1534.      * @since 1.5 
  1535.      */  
  1536.     public StackTraceElement[] getStackTrace() {  
  1537.         if (this != Thread.currentThread()) {  
  1538.             // check for getStackTrace permission  
  1539.             SecurityManager security = System.getSecurityManager();  
  1540.             if (security != null) {  
  1541.                 security.checkPermission(  
  1542.                     SecurityConstants.GET_STACK_TRACE_PERMISSION);  
  1543.             }  
  1544.             // optimization so we do not call into the vm for threads that  
  1545.             // have not yet started or have terminated  
  1546.             if (!isAlive()) {  
  1547.                 return EMPTY_STACK_TRACE;  
  1548.             }  
  1549.             StackTraceElement[][] stackTraceArray = dumpThreads(new Thread[] {this});  
  1550.             StackTraceElement[] stackTrace = stackTraceArray[0];  
  1551.             // a thread that was alive during the previous isAlive call may have  
  1552.             // since terminated, therefore not having a stacktrace.  
  1553.             if (stackTrace == null) {  
  1554.                 stackTrace = EMPTY_STACK_TRACE;  
  1555.             }  
  1556.             return stackTrace;  
  1557.         } else {  
  1558.             // Don't need JVM help for current thread  
  1559.             return (new Exception()).getStackTrace();  
  1560.         }  
  1561.     }  
  1562.   
  1563.     /** 
  1564.      * Returns a map of stack traces for all live threads. 
  1565.      * The map keys are threads and each map value is an array of 
  1566.      * StackTraceElement that represents the stack dump 
  1567.      * of the corresponding Thread
  1568.      * The returned stack traces are in the format specified for 
  1569.      * the {@link #getStackTrace getStackTrace} method. 
  1570.      * 
  1571.      * 

    The threads may be executing while this method is called. 

  1572.      * The stack trace of each thread only represents a snapshot and 
  1573.      * each stack trace may be obtained at different time.  A zero-length 
  1574.      * array will be returned in the map value if the virtual machine has 
  1575.      * no stack trace information about a thread. 
  1576.      * 
  1577.      * 

    If there is a security manager, then the security manager's 

  1578.      * checkPermission method is called with a 
  1579.      * RuntimePermission("getStackTrace") permission as well as 
  1580.      * RuntimePermission("modifyThreadGroup") permission 
  1581.      * to see if it is ok to get the stack trace of all threads. 
  1582.      * 
  1583.      * @return a Map from Thread to an array of 
  1584.      * StackTraceElement that represents the stack trace of 
  1585.      * the corresponding thread. 
  1586.      * 
  1587.      * @throws SecurityException 
  1588.      *        if a security manager exists and its 
  1589.      *        checkPermission method doesn't allow 
  1590.      *        getting the stack trace of thread. 
  1591.      * @see #getStackTrace 
  1592.      * @see SecurityManager#checkPermission 
  1593.      * @see RuntimePermission 
  1594.      * @see Throwable#getStackTrace 
  1595.      * 
  1596.      * @since 1.5 
  1597.      */  
  1598.     public static Map getAllStackTraces() {  
  1599.         // check for getStackTrace permission  
  1600.         SecurityManager security = System.getSecurityManager();  
  1601.         if (security != null) {  
  1602.             security.checkPermission(  
  1603.                 SecurityConstants.GET_STACK_TRACE_PERMISSION);  
  1604.             security.checkPermission(  
  1605.                 SecurityConstants.MODIFY_THREADGROUP_PERMISSION);  
  1606.         }  
  1607.   
  1608.         // Get a snapshot of the list of all threads  
  1609.         Thread[] threads = getThreads();  
  1610.         StackTraceElement[][] traces = dumpThreads(threads);  
  1611.         Map m = new HashMap<>(threads.length);  
  1612.         for (int i = 0; i < threads.length; i++) {  
  1613.             StackTraceElement[] stackTrace = traces[i];  
  1614.             if (stackTrace != null) {  
  1615.                 m.put(threads[i], stackTrace);  
  1616.             }  
  1617.             // else terminated so we don't put it in the map  
  1618.         }  
  1619.         return m;  
  1620.     }  
  1621.   
  1622.   
  1623.     private static final RuntimePermission SUBCLASS_IMPLEMENTATION_PERMISSION =  
  1624.                     new RuntimePermission("enableContextClassLoaderOverride");  
  1625.   
  1626.     /** cache of subclass security audit results */  
  1627.     /* Replace with ConcurrentReferenceHashMap when/if it appears in a future 
  1628.      * release */  
  1629.     private static class Caches {  
  1630.         /** cache of subclass security audit results */  
  1631.         static final ConcurrentMap subclassAudits =  
  1632.             new ConcurrentHashMap<>();  
  1633.   
  1634.         /** queue for WeakReferences to audited subclasses */  
  1635.         static final ReferenceQueue> subclassAuditsQueue =  
  1636.             new ReferenceQueue<>();  
  1637.     }  
  1638.   
  1639.     /** 
  1640.      * Verifies that this (possibly subclass) instance can be constructed 
  1641.      * without violating security constraints: the subclass must not override 
  1642.      * security-sensitive non-final methods, or else the 
  1643.      * "enableContextClassLoaderOverride" RuntimePermission is checked. 
  1644.      */  
  1645.     private static boolean isCCLOverridden(Class cl) {  
  1646.         if (cl == Thread.class)  
  1647.             return false;  
  1648.   
  1649.         processQueue(Caches.subclassAuditsQueue, Caches.subclassAudits);  
  1650.         WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue);  
  1651.         Boolean result = Caches.subclassAudits.get(key);  
  1652.         if (result == null) {  
  1653.             result = Boolean.valueOf(auditSubclass(cl));  
  1654.             Caches.subclassAudits.putIfAbsent(key, result);  
  1655.         }  
  1656.   
  1657.         return result.booleanValue();  
  1658.     }  
  1659.   
  1660.     /** 
  1661.      * Performs reflective checks on given subclass to verify that it doesn't 
  1662.      * override security-sensitive non-final methods.  Returns true if the 
  1663.      * subclass overrides any of the methods, false otherwise. 
  1664.      */  
  1665.     private static boolean auditSubclass(final Class subcl) {  
  1666.         Boolean result = AccessController.doPrivileged(  
  1667.             new PrivilegedAction() {  
  1668.                 public Boolean run() {  
  1669.                     for (Class cl = subcl;  
  1670.                          cl != Thread.class;  
  1671.                          cl = cl.getSuperclass())  
  1672.                     {  
  1673.                         try {  
  1674.                             cl.getDeclaredMethod("getContextClassLoader", new Class[0]);  
  1675.                             return Boolean.TRUE;  
  1676.                         } catch (NoSuchMethodException ex) {  
  1677.                         }  
  1678.                         try {  
  1679.                             Class[] params = {ClassLoader.class};  
  1680.                             cl.getDeclaredMethod("setContextClassLoader", params);  
  1681.                             return Boolean.TRUE;  
  1682.                         } catch (NoSuchMethodException ex) {  
  1683.                         }  
  1684.                     }  
  1685.                     return Boolean.FALSE;  
  1686.                 }  
  1687.             }  
  1688.         );  
  1689.         return result.booleanValue();  
  1690.     }  
  1691.   
  1692.     private native static StackTraceElement[][] dumpThreads(Thread[] threads);  
  1693.     private native static Thread[] getThreads();  
  1694.   
  1695.     /** 
  1696.      * Returns the identifier of this Thread.  The thread ID is a positive 
  1697.      * long number generated when this thread was created. 
  1698.      * The thread ID is unique and remains unchanged during its lifetime. 
  1699.      * When a thread is terminated, this thread ID may be reused. 
  1700.      * 
  1701.      * @return this thread's ID. 
  1702.      * @since 1.5 
  1703.      */  
  1704.     public long getId() {  
  1705.         return tid;  
  1706.     }  
  1707.   
  1708.     /** 
  1709.      * A thread state.  A thread can be in one of the following states: 
  1710.      * 
       
    •      * 
    • {@link #NEW}
       
    •      *     A thread that has not yet started is in this state. 
    •      *     
    •  
    •      * 
    • {@link #RUNNABLE}
       
    •      *     A thread executing in the Java virtual machine is in this state. 
    •      *     
    •  
    •      * 
    • {@link #BLOCKED}
       
    •      *     A thread that is blocked waiting for a monitor lock 
    •      *     is in this state. 
    •      *     
    •  
    •      * 
    • {@link #WAITING}
       
    •      *     A thread that is waiting indefinitely for another thread to 
    •      *     perform a particular action is in this state. 
    •      *     
    •  
    •      * 
    • {@link #TIMED_WAITING}
       
    •      *     A thread that is waiting for another thread to perform an action 
    •      *     for up to a specified waiting time is in this state. 
    •      *     
    •  
    •      * 
    • {@link #TERMINATED}
       
    •      *     A thread that has exited is in this state. 
    •      *     
    •  
    •      * 
     
  1711.      * 
  1712.      * 

     

  1713.      * A thread can be in only one state at a given point in time. 
  1714.      * These states are virtual machine states which do not reflect 
  1715.      * any operating system thread states. 
  1716.      * 
  1717.      * @since   1.5 
  1718.      * @see #getState 
  1719.      */  
  1720.     public enum State {  
  1721.         /** 
  1722.          * Thread state for a thread which has not yet started. 
  1723.          */  
  1724.         NEW,  
  1725.   
  1726.         /** 
  1727.          * Thread state for a runnable thread.  A thread in the runnable 
  1728.          * state is executing in the Java virtual machine but it may 
  1729.          * be waiting for other resources from the operating system 
  1730.          * such as processor. 
  1731.          */  
  1732.         RUNNABLE,  
  1733.   
  1734.         /** 
  1735.          * Thread state for a thread blocked waiting for a monitor lock. 
  1736.          * A thread in the blocked state is waiting for a monitor lock 
  1737.          * to enter a synchronized block/method or 
  1738.          * reenter a synchronized block/method after calling 
  1739.          * {@link Object#wait() Object.wait}. 
  1740.          */  
  1741.         BLOCKED,  
  1742.   
  1743.         /** 
  1744.          * Thread state for a waiting thread. 
  1745.          * A thread is in the waiting state due to calling one of the 
  1746.          * following methods: 
  1747.          * 
       
    •          *   
    • {@link Object#wait() Object.wait} with no timeout
    •  
    •          *   
    • {@link #join() Thread.join} with no timeout
    •  
    •          *   
    • {@link LockSupport#park() LockSupport.park}
    •  
    •          * 
     
  1748.          * 
  1749.          * 

    A thread in the waiting state is waiting for another thread to 

  1750.          * perform a particular action. 
  1751.          * 
  1752.          * For example, a thread that has called Object.wait() 
  1753.          * on an object is waiting for another thread to call 
  1754.          * Object.notify() or Object.notifyAll() on 
  1755.          * that object. A thread that has called Thread.join() 
  1756.          * is waiting for a specified thread to terminate. 
  1757.          */  
  1758.         WAITING,  
  1759.   
  1760.         /** 
  1761.          * Thread state for a waiting thread with a specified waiting time. 
  1762.          * A thread is in the timed waiting state due to calling one of 
  1763.          * the following methods with a specified positive waiting time: 
  1764.          * 
       
    •          *   
    • {@link #sleep Thread.sleep}
    •  
    •          *   
    • {@link Object#wait(long) Object.wait} with timeout
    •  
    •          *   
    • {@link #join(long) Thread.join} with timeout
    •  
    •          *   
    • {@link LockSupport#parkNanos LockSupport.parkNanos}
    •  
    •          *   
    • {@link LockSupport#parkUntil LockSupport.parkUntil}
    •  
    •          * 
     
  1765.          */  
  1766.         TIMED_WAITING,  
  1767.   
  1768.         /** 
  1769.          * Thread state for a terminated thread. 
  1770.          * The thread has completed execution. 
  1771.          */  
  1772.         TERMINATED;  
  1773.     }  
  1774.   
  1775.     /** 
  1776.      * Returns the state of this thread. 
  1777.      * This method is designed for use in monitoring of the system state, 
  1778.      * not for synchronization control. 
  1779.      * 
  1780.      * @return this thread's state. 
  1781.      * @since 1.5 
  1782.      */  
  1783.     public State getState() {  
  1784.         // get current thread state  
  1785.         return sun.misc.VM.toThreadState(threadStatus);  
  1786.     }  
  1787.   
  1788.     // Added in JSR-166  
  1789.   
  1790.     /** 
  1791.      * Interface for handlers invoked when a Thread abruptly 
  1792.      * terminates due to an uncaught exception. 
  1793.      * 

    When a thread is about to terminate due to an uncaught exception 

  1794.      * the Java Virtual Machine will query the thread for its 
  1795.      * UncaughtExceptionHandler using 
  1796.      * {@link #getUncaughtExceptionHandler} and will invoke the handler's 
  1797.      * uncaughtException method, passing the thread and the 
  1798.      * exception as arguments. 
  1799.      * If a thread has not had its UncaughtExceptionHandler 
  1800.      * explicitly set, then its ThreadGroup object acts as its 
  1801.      * UncaughtExceptionHandler. If the ThreadGroup object 
  1802.      * has no 
  1803.      * special requirements for dealing with the exception, it can forward 
  1804.      * the invocation to the {@linkplain #getDefaultUncaughtExceptionHandler 
  1805.      * default uncaught exception handler}. 
  1806.      * 
  1807.      * @see #setDefaultUncaughtExceptionHandler 
  1808.      * @see #setUncaughtExceptionHandler 
  1809.      * @see ThreadGroup#uncaughtException 
  1810.      * @since 1.5 
  1811.      */  
  1812.     public interface UncaughtExceptionHandler {  
  1813.         /** 
  1814.          * Method invoked when the given thread terminates due to the 
  1815.          * given uncaught exception. 
  1816.          * 

    Any exception thrown by this method will be ignored by the 

  1817.          * Java Virtual Machine. 
  1818.          * @param t the thread 
  1819.          * @param e the exception 
  1820.          */  
  1821.         void uncaughtException(Thread t, Throwable e);  
  1822.     }  
  1823.   
  1824.     // null unless explicitly set  
  1825.     private volatile UncaughtExceptionHandler uncaughtExceptionHandler;  
  1826.   
  1827.     // null unless explicitly set  
  1828.     private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;  
  1829.   
  1830.     /** 
  1831.      * Set the default handler invoked when a thread abruptly terminates 
  1832.      * due to an uncaught exception, and no other handler has been defined 
  1833.      * for that thread. 
  1834.      * 
  1835.      * 

    Uncaught exception handling is controlled first by the thread, then 

  1836.      * by the thread's {@link ThreadGroup} object and finally by the default 
  1837.      * uncaught exception handler. If the thread does not have an explicit 
  1838.      * uncaught exception handler set, and the thread's thread group 
  1839.      * (including parent thread groups)  does not specialize its 
  1840.      * uncaughtException method, then the default handler's 
  1841.      * uncaughtException method will be invoked. 
  1842.      * 

    By setting the default uncaught exception handler, an application 

  1843.      * can change the way in which uncaught exceptions are handled (such as 
  1844.      * logging to a specific device, or file) for those threads that would 
  1845.      * already accept whatever "default" behavior the system 
  1846.      * provided. 
  1847.      * 
  1848.      * 

    Note that the default uncaught exception handler should not usually 

  1849.      * defer to the thread's ThreadGroup object, as that could cause 
  1850.      * infinite recursion. 
  1851.      * 
  1852.      * @param eh the object to use as the default uncaught exception handler. 
  1853.      * If null then there is no default handler. 
  1854.      * 
  1855.      * @throws SecurityException if a security manager is present and it 
  1856.      *         denies {@link RuntimePermission} 
  1857.      *         ("setDefaultUncaughtExceptionHandler") 
  1858.      * 
  1859.      * @see #setUncaughtExceptionHandler 
  1860.      * @see #getUncaughtExceptionHandler 
  1861.      * @see ThreadGroup#uncaughtException 
  1862.      * @since 1.5 
  1863.      */  
  1864.     public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) {  
  1865.         SecurityManager sm = System.getSecurityManager();  
  1866.         if (sm != null) {  
  1867.             sm.checkPermission(  
  1868.                 new RuntimePermission("setDefaultUncaughtExceptionHandler")  
  1869.                     );  
  1870.         }  
  1871.   
  1872.          defaultUncaughtExceptionHandler = eh;  
  1873.      }  
  1874.   
  1875.     /** 
  1876.      * Returns the default handler invoked when a thread abruptly terminates 
  1877.      * due to an uncaught exception. If the returned value is null
  1878.      * there is no default. 
  1879.      * @since 1.5 
  1880.      * @see #setDefaultUncaughtExceptionHandler 
  1881.      */  
  1882.     public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler(){  
  1883.         return defaultUncaughtExceptionHandler;  
  1884.     }  
  1885.   
  1886.     /** 
  1887.      * Returns the handler invoked when this thread abruptly terminates 
  1888.      * due to an uncaught exception. If this thread has not had an 
  1889.      * uncaught exception handler explicitly set then this thread's 
  1890.      * ThreadGroup object is returned, unless this thread 
  1891.      * has terminated, in which case null is returned. 
  1892.      * @since 1.5 
  1893.      */  
  1894.     public UncaughtExceptionHandler getUncaughtExceptionHandler() {  
  1895.         return uncaughtExceptionHandler != null ?  
  1896.             uncaughtExceptionHandler : group;  
  1897.     }  
  1898.   
  1899.     /** 
  1900.      * Set the handler invoked when this thread abruptly terminates 
  1901.      * due to an uncaught exception. 
  1902.      * 

    A thread can take full control of how it responds to uncaught 

  1903.      * exceptions by having its uncaught exception handler explicitly set. 
  1904.      * If no such handler is set then the thread's ThreadGroup 
  1905.      * object acts as its handler. 
  1906.      * @param eh the object to use as this thread's uncaught exception 
  1907.      * handler. If null then this thread has no explicit handler. 
  1908.      * @throws  SecurityException  if the current thread is not allowed to 
  1909.      *          modify this thread. 
  1910.      * @see #setDefaultUncaughtExceptionHandler 
  1911.      * @see ThreadGroup#uncaughtException 
  1912.      * @since 1.5 
  1913.      */  
  1914.     public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {  
  1915.         checkAccess();  
  1916.         uncaughtExceptionHandler = eh;  
  1917.     }  
  1918.   
  1919.     /** 
  1920.      * Dispatch an uncaught exception to the handler. This method is 
  1921.      * intended to be called only by the JVM. 
  1922.      */  
  1923.     private void dispatchUncaughtException(Throwable e) {  
  1924.         getUncaughtExceptionHandler().uncaughtException(this, e);  
  1925.     }  
  1926.   
  1927.     /** 
  1928.      * Removes from the specified map any keys that have been enqueued 
  1929.      * on the specified reference queue. 
  1930.      */  
  1931.     static void processQueue(ReferenceQueue> queue,  
  1932.                              ConcurrentMap
  1933.                              WeakReference>, ?> map)  
  1934.     {  
  1935.         Reference> ref;  
  1936.         while((ref = queue.poll()) != null) {  
  1937.             map.remove(ref);  
  1938.         }  
  1939.     }  
  1940.   
  1941.     /** 
  1942.      *  Weak key for Class objects. 
  1943.      **/  
  1944.     static class WeakClassKey extends WeakReference> {  
  1945.         /** 
  1946.          * saved value of the referent's identity hash code, to maintain 
  1947.          * a consistent hash code after the referent has been cleared 
  1948.          */  
  1949.         private final int hash;  
  1950.   
  1951.         /** 
  1952.          * Create a new WeakClassKey to the given object, registered 
  1953.          * with a queue. 
  1954.          */  
  1955.         WeakClassKey(Class cl, ReferenceQueue> refQueue) {  
  1956.             super(cl, refQueue);  
  1957.             hash = System.identityHashCode(cl);  
  1958.         }  
  1959.   
  1960.         /** 
  1961.          * Returns the identity hash code of the original referent. 
  1962.          */  
  1963.         @Override  
  1964.         public int hashCode() {  
  1965.             return hash;  
  1966.         }  
  1967.   
  1968.         /** 
  1969.          * Returns true if the given object is this identical 
  1970.          * WeakClassKey instance, or, if this object's referent has not 
  1971.          * been cleared, if the given object is another WeakClassKey 
  1972.          * instance with the identical non-null referent as this one. 
  1973.          */  
  1974.         @Override  
  1975.         public boolean equals(Object obj) {  
  1976.             if (obj == this)  
  1977.                 return true;  
  1978.   
  1979.             if (obj instanceof WeakClassKey) {  
  1980.                 Object referent = get();  
  1981.                 return (referent != null) &&  
  1982.                        (referent == ((WeakClassKey) obj).get());  
  1983.             } else {  
  1984.                 return false;  
  1985.             }  
  1986.         }  
  1987.     }  
  1988.   
  1989.     /* Some private helper methods */  
  1990.     private native void setPriority0(int newPriority);  
  1991.     private native void stop0(Object o);  
  1992.     private native void suspend0();  
  1993.     private native void resume0();  
  1994.     private native void interrupt0();  
  1995. }  

总结:

实际上,每个thread自带一个ThreadLocalMap,ThreadLocalMap(ThreadLocal t, T firstValue);这个数据结构就存储了每个thread的私有数据,T firstValue是当前线程的私有数据

  public T get() {
        Thread t = Thread.currentThread();   //获得当前线程A
        ThreadLocalMap map = getMap(t);   //获得当前线程A自带的ThreadLocalMap 
        if (map != null) {                     
            ThreadLocalMap.Entry e = map.getEntry(this); //从当前的线程A通过 ThreadLocal 的对象为Key,取出当前线程的私有数据
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

你可能感兴趣的:(java,Thread)