package umontreal.iro.lecuyer.util;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

/**
 * Extends the {@link AbstractChrono} 
 * class to compute the CPU time for a single thread. It is available
 * only under Java 1.5 which provides platform-independent 
 * facilities to get the CPU time for a single thread through management API.
 * 
 * 

* Note that this chrono might not work properly on some systems running Linux because * of a bug in Sun's implementation or Linux kernel. * For instance, this class unexpectedly computes the global CPU time * under Fedora * Core 4, kernel 2.6.17 and JRE version 1.5.0-09. * With Fedora Core 6, kernel 2.6.20, the function is working properly. * As a result, one should not rely on this bug to get the global CPU time. * *

* Note that the above bug does not prevent one from using this chrono to * compute the CPU time for a single-threaded application. In that case, * the global CPU time corresponds to the CPU time of the current thread. * *

* Running timer fonctions when the associated thread is dead will return 0. * */ public class ThreadCPUTimeChrono extends AbstractChrono { private long myThreadId; static ThreadMXBean threadMXBean = null; protected void getTime (long[] tab) { long rawTime = getTime(); final long DIV = 1000000000L; long seconds = rawTime/DIV; long micros = (rawTime % DIV)/1000L; tab[0] = seconds; tab[1] = micros; } protected long getTime() { if (threadMXBean == null) { // We use lazy initialization to avoid a potential exception being wrapped into a confusing // ExceptionInInitializerError. That would happen if this initialization was in a static block instead of // in this method. threadMXBean = ManagementFactory.getThreadMXBean(); if (!threadMXBean.isThreadCpuTimeEnabled()) // Call this only when necessary, because this can throw a SecurityException if // run under a security manager. threadMXBean.setThreadCpuTimeEnabled (true); } long time = threadMXBean.getThreadCpuTime(myThreadId); return time < 0 ? 0 : time; } /** * Constructs a ThreadCPUTimeChrono object associated * with current thread and initializes it to zero. * */ public ThreadCPUTimeChrono() { super(); myThreadId = Thread.currentThread().getId(); init(); } /** * Constructs a ThreadCPUTimeChrono object associated * with the given {@link Thread} variable and initializes it to zero. * */ public ThreadCPUTimeChrono(Thread inThread) { super(); myThreadId = inThread.getId(); init(); } }

Ads help maintain this website.