home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / lang / Thread.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  9.9 KB  |  538 lines

  1. package java.lang;
  2.  
  3. import java.security.AccessControlContext;
  4. import java.security.AccessController;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import sun.misc.SoftCache;
  8. import sun.misc.VM;
  9. import sun.nio.ch.Interruptible;
  10. import sun.security.util.SecurityConstants;
  11.  
  12. public class Thread implements Runnable {
  13.    private char[] name;
  14.    private int priority;
  15.    private Thread threadQ;
  16.    private long eetop;
  17.    private boolean single_step;
  18.    private boolean daemon = false;
  19.    private boolean stillborn = false;
  20.    private Runnable target;
  21.    private ThreadGroup group;
  22.    private ClassLoader contextClassLoader;
  23.    private AccessControlContext inheritedAccessControlContext;
  24.    private static int threadInitNumber;
  25.    ThreadLocal.ThreadLocalMap threadLocals = null;
  26.    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
  27.    private long stackSize;
  28.    private long nativeParkEventPointer;
  29.    private long tid;
  30.    private static long threadSeqNumber;
  31.    private int threadStatus = 0;
  32.    volatile Object parkBlocker;
  33.    private volatile Interruptible blocker;
  34.    private Object blockerLock = new Object();
  35.    public static final int MIN_PRIORITY = 1;
  36.    public static final int NORM_PRIORITY = 5;
  37.    public static final int MAX_PRIORITY = 10;
  38.    private boolean stopBeforeStart;
  39.    private Throwable throwableFromStop;
  40.    private static final StackTraceElement[] EMPTY_STACK_TRACE;
  41.    private static final RuntimePermission SUBCLASS_IMPLEMENTATION_PERMISSION;
  42.    private static final SoftCache subclassAudits;
  43.    private volatile UncaughtExceptionHandler uncaughtExceptionHandler;
  44.    private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;
  45.  
  46.    private static native void registerNatives();
  47.  
  48.    private static synchronized int nextThreadNum() {
  49.       return threadInitNumber++;
  50.    }
  51.  
  52.    private static synchronized long nextThreadID() {
  53.       return ++threadSeqNumber;
  54.    }
  55.  
  56.    void blockedOn(Interruptible var1) {
  57.       synchronized(this.blockerLock) {
  58.          this.blocker = var1;
  59.       }
  60.    }
  61.  
  62.    public static native Thread currentThread();
  63.  
  64.    public static native void yield();
  65.  
  66.    public static native void sleep(long var0) throws InterruptedException;
  67.  
  68.    public static void sleep(long var0, int var2) throws InterruptedException {
  69.       if (var0 < 0L) {
  70.          throw new IllegalArgumentException("timeout value is negative");
  71.       } else if (var2 >= 0 && var2 <= 999999) {
  72.          if (var2 >= 500000 || var2 != 0 && var0 == 0L) {
  73.             ++var0;
  74.          }
  75.  
  76.          sleep(var0);
  77.       } else {
  78.          throw new IllegalArgumentException("nanosecond timeout value out of range");
  79.       }
  80.    }
  81.  
  82.    private void init(ThreadGroup var1, Runnable var2, String var3, long var4) {
  83.       Thread var6 = currentThread();
  84.       SecurityManager var7 = System.getSecurityManager();
  85.       if (var1 == null) {
  86.          if (var7 != null) {
  87.             var1 = var7.getThreadGroup();
  88.          }
  89.  
  90.          if (var1 == null) {
  91.             var1 = var6.getThreadGroup();
  92.          }
  93.       }
  94.  
  95.       var1.checkAccess();
  96.       if (var7 != null && isCCLOverridden(this.getClass())) {
  97.          var7.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
  98.       }
  99.  
  100.       var1.addUnstarted();
  101.       this.group = var1;
  102.       this.daemon = var6.isDaemon();
  103.       this.priority = var6.getPriority();
  104.       this.name = var3.toCharArray();
  105.       if (var7 != null && !isCCLOverridden(var6.getClass())) {
  106.          this.contextClassLoader = var6.contextClassLoader;
  107.       } else {
  108.          this.contextClassLoader = var6.getContextClassLoader();
  109.       }
  110.  
  111.       this.inheritedAccessControlContext = AccessController.getContext();
  112.       this.target = var2;
  113.       this.setPriority(this.priority);
  114.       if (var6.inheritableThreadLocals != null) {
  115.          this.inheritableThreadLocals = ThreadLocal.createInheritedMap(var6.inheritableThreadLocals);
  116.       }
  117.  
  118.       this.stackSize = var4;
  119.       this.tid = nextThreadID();
  120.    }
  121.  
  122.    public Thread() {
  123.       this.init((ThreadGroup)null, (Runnable)null, "Thread-" + nextThreadNum(), 0L);
  124.    }
  125.  
  126.    public Thread(Runnable var1) {
  127.       this.init((ThreadGroup)null, var1, "Thread-" + nextThreadNum(), 0L);
  128.    }
  129.  
  130.    public Thread(ThreadGroup var1, Runnable var2) {
  131.       this.init(var1, var2, "Thread-" + nextThreadNum(), 0L);
  132.    }
  133.  
  134.    public Thread(String var1) {
  135.       this.init((ThreadGroup)null, (Runnable)null, var1, 0L);
  136.    }
  137.  
  138.    public Thread(ThreadGroup var1, String var2) {
  139.       this.init(var1, (Runnable)null, var2, 0L);
  140.    }
  141.  
  142.    public Thread(Runnable var1, String var2) {
  143.       this.init((ThreadGroup)null, var1, var2, 0L);
  144.    }
  145.  
  146.    public Thread(ThreadGroup var1, Runnable var2, String var3) {
  147.       this.init(var1, var2, var3, 0L);
  148.    }
  149.  
  150.    public Thread(ThreadGroup var1, Runnable var2, String var3, long var4) {
  151.       this.init(var1, var2, var3, var4);
  152.    }
  153.  
  154.    public synchronized void start() {
  155.       if (this.threadStatus != 0) {
  156.          throw new IllegalThreadStateException();
  157.       } else {
  158.          this.group.add(this);
  159.          this.start0();
  160.          if (this.stopBeforeStart) {
  161.             this.stop0(this.throwableFromStop);
  162.          }
  163.  
  164.       }
  165.    }
  166.  
  167.    private native void start0();
  168.  
  169.    public void run() {
  170.       if (this.target != null) {
  171.          this.target.run();
  172.       }
  173.  
  174.    }
  175.  
  176.    private void exit() {
  177.       if (this.group != null) {
  178.          this.group.remove(this);
  179.          this.group = null;
  180.       }
  181.  
  182.       this.target = null;
  183.       this.threadLocals = null;
  184.       this.inheritableThreadLocals = null;
  185.       this.inheritedAccessControlContext = null;
  186.       this.blocker = null;
  187.       this.uncaughtExceptionHandler = null;
  188.    }
  189.  
  190.    /** @deprecated */
  191.    @Deprecated
  192.    public final void stop() {
  193.       if (this.threadStatus == 0 || this.isAlive()) {
  194.          this.stop1(new ThreadDeath());
  195.       }
  196.    }
  197.  
  198.    /** @deprecated */
  199.    @Deprecated
  200.    public final synchronized void stop(Throwable var1) {
  201.       this.stop1(var1);
  202.    }
  203.  
  204.    private final synchronized void stop1(Throwable var1) {
  205.       SecurityManager var2 = System.getSecurityManager();
  206.       if (var2 != null) {
  207.          this.checkAccess();
  208.          if (this != currentThread() || !(var1 instanceof ThreadDeath)) {
  209.             var2.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION);
  210.          }
  211.       }
  212.  
  213.       if (this.threadStatus != 0) {
  214.          this.resume();
  215.          this.stop0(var1);
  216.       } else {
  217.          if (var1 == null) {
  218.             throw new NullPointerException();
  219.          }
  220.  
  221.          this.stopBeforeStart = true;
  222.          this.throwableFromStop = var1;
  223.       }
  224.  
  225.    }
  226.  
  227.    public void interrupt() {
  228.       if (this != currentThread()) {
  229.          this.checkAccess();
  230.       }
  231.  
  232.       synchronized(this.blockerLock) {
  233.          Interruptible var2 = this.blocker;
  234.          if (var2 != null) {
  235.             this.interrupt0();
  236.             var2.interrupt();
  237.             return;
  238.          }
  239.       }
  240.  
  241.       this.interrupt0();
  242.    }
  243.  
  244.    public static boolean interrupted() {
  245.       return currentThread().isInterrupted(true);
  246.    }
  247.  
  248.    public boolean isInterrupted() {
  249.       return this.isInterrupted(false);
  250.    }
  251.  
  252.    private native boolean isInterrupted(boolean var1);
  253.  
  254.    /** @deprecated */
  255.    @Deprecated
  256.    public void destroy() {
  257.       throw new NoSuchMethodError();
  258.    }
  259.  
  260.    public final native boolean isAlive();
  261.  
  262.    /** @deprecated */
  263.    @Deprecated
  264.    public final void suspend() {
  265.       this.checkAccess();
  266.       this.suspend0();
  267.    }
  268.  
  269.    /** @deprecated */
  270.    @Deprecated
  271.    public final void resume() {
  272.       this.checkAccess();
  273.       this.resume0();
  274.    }
  275.  
  276.    public final void setPriority(int var1) {
  277.       this.checkAccess();
  278.       if (var1 <= 10 && var1 >= 1) {
  279.          ThreadGroup var2;
  280.          if ((var2 = this.getThreadGroup()) != null) {
  281.             if (var1 > var2.getMaxPriority()) {
  282.                var1 = var2.getMaxPriority();
  283.             }
  284.  
  285.             this.setPriority0(this.priority = var1);
  286.          }
  287.  
  288.       } else {
  289.          throw new IllegalArgumentException();
  290.       }
  291.    }
  292.  
  293.    public final int getPriority() {
  294.       return this.priority;
  295.    }
  296.  
  297.    public final void setName(String var1) {
  298.       this.checkAccess();
  299.       this.name = var1.toCharArray();
  300.    }
  301.  
  302.    public final String getName() {
  303.       return String.valueOf(this.name);
  304.    }
  305.  
  306.    public final ThreadGroup getThreadGroup() {
  307.       return this.group;
  308.    }
  309.  
  310.    public static int activeCount() {
  311.       return currentThread().getThreadGroup().activeCount();
  312.    }
  313.  
  314.    public static int enumerate(Thread[] var0) {
  315.       return currentThread().getThreadGroup().enumerate(var0);
  316.    }
  317.  
  318.    /** @deprecated */
  319.    @Deprecated
  320.    public native int countStackFrames();
  321.  
  322.    public final synchronized void join(long var1) throws InterruptedException {
  323.       long var3 = System.currentTimeMillis();
  324.       long var5 = 0L;
  325.       if (var1 < 0L) {
  326.          throw new IllegalArgumentException("timeout value is negative");
  327.       } else {
  328.          if (var1 == 0L) {
  329.             while(this.isAlive()) {
  330.                this.wait(0L);
  331.             }
  332.          } else {
  333.             while(this.isAlive()) {
  334.                long var7 = var1 - var5;
  335.                if (var7 <= 0L) {
  336.                   break;
  337.                }
  338.  
  339.                this.wait(var7);
  340.                var5 = System.currentTimeMillis() - var3;
  341.             }
  342.          }
  343.  
  344.       }
  345.    }
  346.  
  347.    public final synchronized void join(long var1, int var3) throws InterruptedException {
  348.       if (var1 < 0L) {
  349.          throw new IllegalArgumentException("timeout value is negative");
  350.       } else if (var3 >= 0 && var3 <= 999999) {
  351.          if (var3 >= 500000 || var3 != 0 && var1 == 0L) {
  352.             ++var1;
  353.          }
  354.  
  355.          this.join(var1);
  356.       } else {
  357.          throw new IllegalArgumentException("nanosecond timeout value out of range");
  358.       }
  359.    }
  360.  
  361.    public final void join() throws InterruptedException {
  362.       this.join(0L);
  363.    }
  364.  
  365.    public static void dumpStack() {
  366.       (new Exception("Stack trace")).printStackTrace();
  367.    }
  368.  
  369.    public final void setDaemon(boolean var1) {
  370.       this.checkAccess();
  371.       if (this.isAlive()) {
  372.          throw new IllegalThreadStateException();
  373.       } else {
  374.          this.daemon = var1;
  375.       }
  376.    }
  377.  
  378.    public final boolean isDaemon() {
  379.       return this.daemon;
  380.    }
  381.  
  382.    public final void checkAccess() {
  383.       SecurityManager var1 = System.getSecurityManager();
  384.       if (var1 != null) {
  385.          var1.checkAccess(this);
  386.       }
  387.  
  388.    }
  389.  
  390.    public String toString() {
  391.       ThreadGroup var1 = this.getThreadGroup();
  392.       return var1 != null ? "Thread[" + this.getName() + "," + this.getPriority() + "," + var1.getName() + "]" : "Thread[" + this.getName() + "," + this.getPriority() + "," + "" + "]";
  393.    }
  394.  
  395.    public ClassLoader getContextClassLoader() {
  396.       if (this.contextClassLoader == null) {
  397.          return null;
  398.       } else {
  399.          SecurityManager var1 = System.getSecurityManager();
  400.          if (var1 != null) {
  401.             ClassLoader var2 = ClassLoader.getCallerClassLoader();
  402.             if (var2 != null && var2 != this.contextClassLoader && !this.contextClassLoader.isAncestor(var2)) {
  403.                var1.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
  404.             }
  405.          }
  406.  
  407.          return this.contextClassLoader;
  408.       }
  409.    }
  410.  
  411.    public void setContextClassLoader(ClassLoader var1) {
  412.       SecurityManager var2 = System.getSecurityManager();
  413.       if (var2 != null) {
  414.          var2.checkPermission(new RuntimePermission("setContextClassLoader"));
  415.       }
  416.  
  417.       this.contextClassLoader = var1;
  418.    }
  419.  
  420.    public static native boolean holdsLock(Object var0);
  421.  
  422.    public StackTraceElement[] getStackTrace() {
  423.       if (this != currentThread()) {
  424.          SecurityManager var1 = System.getSecurityManager();
  425.          if (var1 != null) {
  426.             var1.checkPermission(SecurityConstants.GET_STACK_TRACE_PERMISSION);
  427.          }
  428.  
  429.          return !this.isAlive() ? EMPTY_STACK_TRACE : dumpThreads(new Thread[]{this})[0];
  430.       } else {
  431.          return (new Exception()).getStackTrace();
  432.       }
  433.    }
  434.  
  435.    public static Map<Thread, StackTraceElement[]> getAllStackTraces() {
  436.       SecurityManager var0 = System.getSecurityManager();
  437.       if (var0 != null) {
  438.          var0.checkPermission(SecurityConstants.GET_STACK_TRACE_PERMISSION);
  439.          var0.checkPermission(SecurityConstants.MODIFY_THREADGROUP_PERMISSION);
  440.       }
  441.  
  442.       Thread[] var1 = getThreads();
  443.       StackTraceElement[][] var2 = dumpThreads(var1);
  444.       HashMap var3 = new HashMap(var1.length);
  445.  
  446.       for(int var4 = 0; var4 < var1.length; ++var4) {
  447.          if (var1[var4].isAlive()) {
  448.             StackTraceElement[] var5 = var2[var4];
  449.             if (var5 == null) {
  450.                var5 = EMPTY_STACK_TRACE;
  451.             }
  452.  
  453.             var3.put(var1[var4], var5);
  454.          }
  455.       }
  456.  
  457.       return var3;
  458.    }
  459.  
  460.    private static boolean isCCLOverridden(Class var0) {
  461.       if (var0 == Thread.class) {
  462.          return false;
  463.       } else {
  464.          Object var1 = null;
  465.          Boolean var5;
  466.          synchronized(subclassAudits) {
  467.             var5 = (Boolean)subclassAudits.get(var0);
  468.             if (var5 == null) {
  469.                var5 = new Boolean(auditSubclass(var0));
  470.                subclassAudits.put(var0, var5);
  471.             }
  472.          }
  473.  
  474.          return var5;
  475.       }
  476.    }
  477.  
  478.    private static boolean auditSubclass(Class var0) {
  479.       Boolean var1 = (Boolean)AccessController.doPrivileged(new 1(var0));
  480.       return var1;
  481.    }
  482.  
  483.    private static native StackTraceElement[][] dumpThreads(Thread[] var0);
  484.  
  485.    private static native Thread[] getThreads();
  486.  
  487.    public long getId() {
  488.       return this.tid;
  489.    }
  490.  
  491.    public State getState() {
  492.       return VM.toThreadState(this.threadStatus);
  493.    }
  494.  
  495.    public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler var0) {
  496.       SecurityManager var1 = System.getSecurityManager();
  497.       if (var1 != null) {
  498.          var1.checkPermission(new RuntimePermission("setDefaultUncaughtExceptionHandler"));
  499.       }
  500.  
  501.       defaultUncaughtExceptionHandler = var0;
  502.    }
  503.  
  504.    public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() {
  505.       return defaultUncaughtExceptionHandler;
  506.    }
  507.  
  508.    public UncaughtExceptionHandler getUncaughtExceptionHandler() {
  509.       return (UncaughtExceptionHandler)(this.uncaughtExceptionHandler != null ? this.uncaughtExceptionHandler : this.group);
  510.    }
  511.  
  512.    public void setUncaughtExceptionHandler(UncaughtExceptionHandler var1) {
  513.       this.checkAccess();
  514.       this.uncaughtExceptionHandler = var1;
  515.    }
  516.  
  517.    private void dispatchUncaughtException(Throwable var1) {
  518.       this.getUncaughtExceptionHandler().uncaughtException(this, var1);
  519.    }
  520.  
  521.    private native void setPriority0(int var1);
  522.  
  523.    private native void stop0(Object var1);
  524.  
  525.    private native void suspend0();
  526.  
  527.    private native void resume0();
  528.  
  529.    private native void interrupt0();
  530.  
  531.    static {
  532.       registerNatives();
  533.       EMPTY_STACK_TRACE = new StackTraceElement[0];
  534.       SUBCLASS_IMPLEMENTATION_PERMISSION = new RuntimePermission("enableContextClassLoaderOverride");
  535.       subclassAudits = new SoftCache(10);
  536.    }
  537. }
  538.