/* * @(#)ThreadInfo.java 1.16 04/04/18 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.lang.management; import javax.management.openmbean.CompositeData; import sun.management.ThreadInfoCompositeData; /** * Thread information. ThreadInfo contains the information * about a thread including: *

General thread information

* * *

Execution information

* * *

Synchronization statistics

* * *

This thread information class is designed for use in monitoring of * the system, not for synchronization control. * *

MXBean Mapping

* ThreadInfo is mapped to a {@link CompositeData CompositeData} * with attributes as specified in * the {@link #from from} method. * * @see ThreadMXBean#isThreadContentionMonitoringSupported * * @author Mandy Chung * @version 1.16, 04/18/04 * @since 1.5 */ public class ThreadInfo { private final String threadName; private final long threadId; private final long blockedTime; private final long blockedCount; private final long waitedTime; private final long waitedCount; private final String lockName; private final long lockOwnerId; private final String lockOwnerName; private final boolean inNative; private final boolean suspended; private final Thread.State threadState; private final StackTraceElement[] stackTrace; /** * Constructor of ThreadInfo created by the JVM * * @param t Thread * @param state Thread state * @param lockObj Object on which the thread is blocked * to enter or waiting * @param lockOwner the thread holding the lock * @param blockedCount Number of times blocked to enter a lock * @param blockedTime Approx time blocked to enter a lock * @param waitedCount Number of times waited on a lock * @param waitedTime Approx time waited on a lock * @param stackTrace Thread stack trace */ private ThreadInfo(Thread t, int state, Object lockObj, Thread lockOwner, long blockedCount, long blockedTime, long waitedCount, long waitedTime, StackTraceElement[] stackTrace) { this.threadId = t.getId(); this.threadName = t.getName(); this.threadState = sun.management.ManagementFactory.toThreadState(state); this.suspended = sun.management.ManagementFactory.isThreadSuspended(state); this.inNative = sun.management.ManagementFactory.isThreadRunningNative(state); this.blockedCount = blockedCount; this.blockedTime = blockedTime; this.waitedCount = waitedCount; this.waitedTime = waitedTime; if (lockObj == null) { this.lockName = null; } else { this.lockName = lockObj.getClass().getName() + '@' + Integer.toHexString(System.identityHashCode(lockObj)); } if (lockOwner == null) { this.lockOwnerId = -1; this.lockOwnerName = null; } else {; this.lockOwnerId = lockOwner.getId(); this.lockOwnerName = lockOwner.getName(); } this.stackTrace = stackTrace; } /* * Constructs a ThreadInfo object from a * {@link CompositeData CompositeData}. */ private ThreadInfo(CompositeData cd) { ThreadInfoCompositeData.validateCompositeData(cd); threadId = ThreadInfoCompositeData.getThreadId(cd); threadName = ThreadInfoCompositeData.getThreadName(cd); blockedTime = ThreadInfoCompositeData.getBlockedTime(cd); blockedCount = ThreadInfoCompositeData.getBlockedCount(cd); waitedTime = ThreadInfoCompositeData.getWaitedTime(cd); waitedCount = ThreadInfoCompositeData.getWaitedCount(cd); lockName = ThreadInfoCompositeData.getLockName(cd); lockOwnerId = ThreadInfoCompositeData.getLockOwnerId(cd); lockOwnerName = ThreadInfoCompositeData.getLockOwnerName(cd); threadState = ThreadInfoCompositeData.getThreadState(cd); suspended = ThreadInfoCompositeData.isSuspended(cd); inNative = ThreadInfoCompositeData.isInNative(cd); stackTrace = ThreadInfoCompositeData.getStackTrace(cd); } /** * Returns the ID of the thread associated with this ThreadInfo. * * @return the ID of the associated thread. */ public long getThreadId() { return threadId; } /** * Returns the name of the thread associated with this ThreadInfo. * * @return the name of the associated thread. */ public String getThreadName() { return threadName; } /** * Returns the state of the thread associated with this ThreadInfo. * * @return Thread.State of the associated thread. */ public Thread.State getThreadState() { return threadState; } /** * Returns the approximate accumulated elapsed time (in milliseconds) * that the thread associated with this ThreadInfo * has blocked to enter or reenter a monitor * since thread contention monitoring is enabled. * I.e. the total accumulated time the thread has been in the * {@link java.lang.Thread.State#BLOCKED BLOCKED} state since thread * contention monitoring was last enabled. * This method returns -1 if thread contention monitoring * is disabled. * *

The Java virtual machine may measure the time with a high * resolution timer. This statistic is reset when * the thread contention monitoring is reenabled. * * @return the approximate accumulated elapsed time in milliseconds * that a thread entered the BLOCKED state; * -1 if thread contention monitoring is disabled. * * @throws java.lang.UnsupportedOperationException if the Java * virtual machine does not support this operation. * * @see ThreadMXBean#isThreadContentionMonitoringSupported * @see ThreadMXBean#setThreadContentionMonitoringEnabled */ public long getBlockedTime() { return blockedTime; } /** * Returns the total number of times that * the thread associated with this ThreadInfo * blocked to enter or reenter a monitor. * I.e. the number of times a thread has been in the * {@link java.lang.Thread.State#BLOCKED BLOCKED} state. * * @return the total number of times that the thread * entered the BLOCKED state. */ public long getBlockedCount() { return blockedCount; } /** * Returns the approximate accumulated elapsed time (in milliseconds) * that the thread associated with this ThreadInfo * has waited for notification * since thread contention monitoring is enabled. * I.e. the total accumulated time the thread has been in the * {@link java.lang.Thread.State#WAITING WAITING} * or {@link java.lang.Thread.State#TIMED_WAITING TIMED_WAITING} state * since thread contention monitoring is enabled. * This method returns -1 if thread contention monitoring * is disabled. * *

The Java virtual machine may measure the time with a high * resolution timer. This statistic is reset when * the thread contention monitoring is reenabled. * * @return the approximate accumulated elapsed time in milliseconds * that a thread has been in the WAITING or * TIMED_WAITING state; * -1 if thread contention monitoring is disabled. * * @throws java.lang.UnsupportedOperationException if the Java * virtual machine does not support this operation. * * @see ThreadMXBean#isThreadContentionMonitoringSupported * @see ThreadMXBean#setThreadContentionMonitoringEnabled */ public long getWaitedTime() { return waitedTime; } /** * Returns the total number of times that * the thread associated with this ThreadInfo * waited for notification. * I.e. the number of times that a thread has been * in the {@link java.lang.Thread.State#WAITING WAITING} * or {@link java.lang.Thread.State#TIMED_WAITING TIMED_WAITING} state. * * @return the total number of times that the thread * was in the WAITING or TIMED_WAITING state. */ public long getWaitedCount() { return waitedCount; } /** * Returns the string representation of the monitor lock that * the thread associated with this ThreadInfo * is blocked to enter or waiting to be notified through * the {@link Object#wait Object.wait} method. * The returned string representation of a monitor lock consists of * the name of the class of which the object is an instance, the * at-sign character `@', and the unsigned hexadecimal representation * of the identity hash code of the object. * The returned string may not * be unique depending on the implementation of the * {@link System#identityHashCode} method. * This method returns a string equals to the value of: *

*
     * lock.getClass().getName() + '@' + Integer.toHexString(System.identityHashCode(lock))
     * 
* where lock is the monitor lock object. * *

If the thread is not blocking to enter on any monitor object, * or is not waiting on a monitor object for notification in a * Object.wait call, * this method returns null. * * @return the string representation of the monitor lock that * the thread is blocking to enter or waiting to be notified through * the Object.wait method if any; * null otherwise. * */ public String getLockName() { return lockName; } /** * Returns the ID of the thread which holds the monitor lock of an object * on which the thread associated with this ThreadInfo * is blocking. * This method will return -1 if this thread is not blocked * or waiting on any monitor, or if the monitor lock is not held * by any thread. * * @return the thread ID of the owner thread of the monitor lock of the * object this thread is blocking on; * -1 if this thread is not blocked * or waiting on any monitor, or if the monitor lock is not held * by any thread. * * @see #getLockName */ public long getLockOwnerId() { return lockOwnerId; } /** * Returns the name of the thread which holds the monitor lock of an object * on which the thread associated with this ThreadInfo * is blocking. * This method will return null if this thread is not blocked * or waiting on any monitor, or if the monitor lock is not held * by any thread. * * @return the name of the thread that holds the monitor lock of the object * this thread is blocking on; * null if this thread is not blocked * or waiting on any monitor, or if the monitor lock is not held * by any thread. * * @see #getLockName */ public String getLockOwnerName() { return lockOwnerName; } /** * Returns the stack trace of the thread * associated with this ThreadInfo. * If no stack trace was requested for this thread info, this method * will return a zero-length array. * If the returned array is of non-zero length then the first element of * the array represents the top of the stack, which is the most recent * method invocation in the sequence. The last element of the array * represents the bottom of the stack, which is the least recent method * invocation in the sequence. * *

Some Java virtual machines may, under some circumstances, omit one * or more stack frames from the stack trace. In the extreme case, * a virtual machine that has no stack trace information concerning * the thread associated with this ThreadInfo * is permitted to return a zero-length array from this method. * * @return an array of StackTraceElement objects of the thread. */ public StackTraceElement[] getStackTrace() { if (stackTrace == null) { return NO_STACK_TRACE; } else { return stackTrace; } } /** * Tests if the thread associated with this ThreadInfo * is suspended. This method returns true if * {@link Thread#suspend} has been called. * * @return true if the thread is suspended; * false otherwise. */ public boolean isSuspended() { return suspended; } /** * Tests if the thread associated with this ThreadInfo * is executing native code via the Java Native Interface (JNI). * The JNI native code does not include * the virtual machine support code or the compiled native * code generated by the virtual machine. * * @return true if the thread is executing native code; * false otherwise. */ public boolean isInNative() { return inNative; } /** * Returns a string representation of this thread info. * * @return a string representation of this thread info. */ public String toString() { return "Thread " + getThreadName() + " (Id = " + getThreadId() + ") " + getThreadState() + " " + getLockName(); } /** * Returns a ThreadInfo object represented by the * given CompositeData. * The given CompositeData must contain the following attributes: *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Attribute NameType
threadIdjava.lang.Long
threadNamejava.lang.String
threadStatejava.lang.String
suspendedjava.lang.Boolean
inNativejava.lang.Boolean
blockedCountjava.lang.Long
blockedTimejava.lang.Long
waitedCountjava.lang.Long
waitedTimejava.lang.Long
lockNamejava.lang.String
lockOwnerIdjava.lang.Long
lockOwnerNamejava.lang.String
stackTracejavax.management.openmbean.CompositeData[] *

* Each element is a CompositeData representing * StackTraceElement containing the following attributes: *

* * * * * * * * * * * * * * * * * * * * * * * * * *
Attribute NameType
classNamejava.lang.String
methodNamejava.lang.String
fileNamejava.lang.String
lineNumberjava.lang.Integer
nativeMethodjava.lang.Boolean
*
*
*
* * @param cd CompositeData representing a ThreadInfo * * @throws IllegalArgumentException if cd does not * represent a ThreadInfo with the attributes described * above. * @return a ThreadInfo object represented * by cd if cd is not null; * null otherwise. */ public static ThreadInfo from(CompositeData cd) { if (cd == null) { return null; } if (cd instanceof ThreadInfoCompositeData) { return ((ThreadInfoCompositeData) cd).getThreadInfo(); } else { return new ThreadInfo(cd); } } private static final StackTraceElement[] NO_STACK_TRACE = new StackTraceElement[0]; }