import java.lang.management.ThreadMXBean; //导入方法依赖的package包/类
/**
* Does the thread measurement. For this, a single thread will be started and the results
* will be transfered to the specified {@link ThreadProtocolReceiver}.
*
* @see ThreadProtocolReceiver
*
* @param timestamp the time stamp of the initial request
* @param threadProtocolReceiver the {@link ThreadProtocolReceiver}
*/
public static void doThreadMeasurement(final long timestamp, final ThreadProtocolReceiver threadProtocolReceiver) {
if (timestamp!=threadMeasurementLastTimeStamp) {
// --- Remind this time stamp in order to avoid double work -------
threadMeasurementLastTimeStamp = timestamp;
// --- Start Thread to do0 the work -------------------------------
Runnable threadMeasurement = new Runnable() {
@Override
public void run() {
// --- Create a protocol instance -------------------------
ThreadProtocol tp = new ThreadProtocol(timestamp, getLoadCPU());
// --- Configure ThreadMXBean if possible and needed ------
ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();
if (tmxb.isThreadCpuTimeSupported()==true){
if(tmxb.isThreadCpuTimeEnabled()==false){
tmxb.setThreadCpuTimeEnabled(true);
}
} else{
System.err.println("ThreadTimeMeasurement not supported !!");
threadProtocolReceiver.receiveThreadProtocol(null);
return;
}
// --- Do measurement -------------------------------------
String threadName;
long nanosCpuTime = 0L;
long nanosUserTime = 0L;
long factorMiliseconds = 1000000;
long[] threadIDs = tmxb.getAllThreadIds();
for (int i = 0; i < threadIDs.length; i++) {
long threadID = threadIDs[i];
nanosCpuTime = tmxb.getThreadCpuTime(threadID);
nanosUserTime = tmxb.getThreadUserTime(threadID);
if (nanosCpuTime==-1 || nanosUserTime==-1) {
continue; // Thread died
}
threadName = tmxb.getThreadInfo(threadID).getThreadName();
// --- add times, converted to milliseconds, to thread-Protocol
tp.getThreadDetails().add(new ThreadDetail(threadName, (nanosCpuTime/factorMiliseconds), (nanosUserTime/factorMiliseconds)));
}
// --- Send protocol to the requester of the measurement --
threadProtocolReceiver.receiveThreadProtocol(tp);
}
};
// --- Start measurement thread -----------------------------------
threadMeasurement.run();
}
}