import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.util.Arrays; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.border.EmptyBorder; public class ThreadMXBeanTest { private ThreadMXBean mbean; private JTabbedPane tabbedPane; public ThreadMXBeanTest() { initView(); mbean = ManagementFactory.getThreadMXBean(); mbean.setThreadContentionMonitoringEnabled(true); updateInfo(); } private void initView() { JFrame frame = new JFrame("Thread Infomation"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); tabbedPane = new JTabbedPane(); frame.getContentPane().add(tabbedPane); JButton updateButton = new JButton("Update"); updateButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { clearInfoTab(); updateInfo(); } }); frame.getContentPane().add(updateButton, BorderLayout.NORTH); frame.setVisible(true); } private void updateInfo() { long[] ids = mbean.getAllThreadIds(); Arrays.sort(ids); for (long id: ids) { long cputime = mbean.getThreadCpuTime(id); ThreadInfo info = mbean.getThreadInfo(id, 5); addInfoTab(cputime, info); } } private void clearInfoTab() { tabbedPane.removeAll(); } private void addInfoTab(long cputime, ThreadInfo info) { JPanel panel = new JPanel(); panel.setBorder(new EmptyBorder(10, 10, 10, 10)); panel.setLayout(new CompactGridLayout(0, 2, 2, 20)); updateInfoTab(panel, cputime, info); tabbedPane.add(info.getThreadId() + ":" + info.getThreadName() , new JScrollPane(panel)); } private void updateInfoTab(JPanel panel, long cputime, ThreadInfo info) { long id = -1; String name = ""; Thread.State state = null; boolean isSuspended = false; boolean isInNative = false; long blockedTime = -1; long blockedCount = -1; long waitedTime = -1; long waitedCount = -1; String lockName = ""; long lockOwnerId = -1; String lockOwnerName = ""; String stackTrace = ""; synchronized (info) { id = info.getThreadId(); name = info.getThreadName(); state = info.getThreadState(); isSuspended = info.isSuspended(); isInNative = info.isInNative(); blockedTime = info.getBlockedTime(); blockedCount = info.getBlockedCount(); waitedTime = info.getWaitedTime(); waitedCount = info.getWaitedCount(); lockName = info.getLockName(); lockOwnerId = info.getLockOwnerId(); lockOwnerName = info.getLockOwnerName(); StringBuilder buffer = new StringBuilder(); buffer.append("
"); for (StackTraceElement element: info.getStackTrace()) { buffer.append(element.toString()); buffer.append("