29
29
import java .lang .management .ManagementFactory ;
30
30
import java .lang .management .ThreadInfo ;
31
31
import java .lang .management .ThreadMXBean ;
32
+ import java .util .logging .Level ;
33
+ import java .util .logging .Logger ;
32
34
import javax .management .InstanceNotFoundException ;
33
35
import javax .management .MBeanException ;
34
36
import javax .management .MBeanServerConnection ;
42
44
*/
43
45
public class ThreadsCPU {
44
46
private static final ObjectName THREAD_NAME = getThreadName ();
47
+ private static final Logger LOGGER = Logger .getLogger (ThreadsCPU .class .getName ());
45
48
46
49
private final ThreadMXBean threadBean ;
47
50
private final MBeanServerConnection connection ;
51
+ private boolean useBulkOperation = true ;
48
52
49
53
public ThreadsCPU (ThreadMXBean bean , MBeanServerConnection conn ) {
50
54
threadBean = bean ;
@@ -54,9 +58,26 @@ public ThreadsCPU(ThreadMXBean bean, MBeanServerConnection conn) {
54
58
public ThreadsCPUInfo getThreadsCPUInfo () throws MBeanException , ReflectionException , IOException , InstanceNotFoundException {
55
59
long [] ids = threadBean .getAllThreadIds ();
56
60
ThreadInfo [] tids = threadBean .getThreadInfo (ids );
57
- Object [] args = new Object [] {ids };
58
- String [] sigs = new String [] {"[J" }; // NOI18N
59
- long [] tinfo = (long [])connection .invoke (THREAD_NAME , "getThreadCpuTime" , args , sigs ); // NOI18N
61
+ long [] tinfo ;
62
+
63
+ if (useBulkOperation ) {
64
+ Object [] args = new Object [] {ids };
65
+ String [] sigs = new String [] {"[J" }; // NOI18N
66
+
67
+ try {
68
+ tinfo = (long [])connection .invoke (THREAD_NAME , "getThreadCpuTime" , args , sigs ); // NOI18N
69
+ } catch (javax .management .ReflectionException ex ) {
70
+ LOGGER .log (Level .INFO , "getThreadCpuTime failed" , ex );
71
+ useBulkOperation = false ;
72
+ return getThreadsCPUInfo ();
73
+ }
74
+ } else {
75
+ tinfo = new long [ids .length ];
76
+
77
+ for (int i = 0 ; i < ids .length ; i ++) {
78
+ tinfo [i ] = threadBean .getThreadCpuTime (ids [i ]);
79
+ }
80
+ }
60
81
long time = System .currentTimeMillis ();
61
82
62
83
return new ThreadsCPUInfo (time ,tids ,tinfo );
0 commit comments