1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.message;
18
19 import java.lang.management.ManagementFactory;
20 import java.lang.management.ThreadInfo;
21 import java.lang.management.ThreadMXBean;
22 import java.lang.reflect.Method;
23 import java.util.HashMap;
24 import java.util.Map;
25
26 import org.apache.logging.log4j.message.ThreadDumpMessage;
27 import org.apache.logging.log4j.message.ThreadInformation;
28
29
30
31
32 public class ExtendedThreadInfoFactory implements ThreadDumpMessage.ThreadInfoFactory {
33 public ExtendedThreadInfoFactory() {
34 final Method[] methods = ThreadInfo.class.getMethods();
35 boolean basic = true;
36 for (final Method method : methods) {
37 if (method.getName().equals("getLockInfo")) {
38 basic = false;
39 break;
40 }
41 }
42 if (basic) {
43 throw new IllegalStateException();
44 }
45 }
46 @Override
47 public Map<ThreadInformation, StackTraceElement[]> createThreadInfo() {
48 final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
49 final ThreadInfo[] array = bean.dumpAllThreads(true, true);
50
51 final Map<ThreadInformation, StackTraceElement[]> threads =
52 new HashMap<>(array.length);
53 for (final ThreadInfo info : array) {
54 threads.put(new ExtendedThreadInformation(info), info.getStackTrace());
55 }
56 return threads;
57 }
58 }