获取 Java VM 中当前运行的所有线程
程序运行图:
下面的静态方法可以用数组返回 Java VM 中当前运行的所有线程
public static Thread[] findAllThreads() {
ThreadGroup group =
Thread.currentThread().getThreadGroup();
ThreadGroup topGroup = group;
// 遍历线程组树,获取根线程组
while ( group != null ) {
topGroup = group;
group = group.getParent();
}
// 激活的线程数加倍
int estimatedSize = topGroup.activeCount() * 2;
Thread[] slackList = new Thread[estimatedSize];
//获取根线程组的所有线程
int actualSize = topGroup.enumerate(slackList);
// copy into a list that is the exact size
Thread[] list = new Thread[actualSize];
System.arraycopy(slackList, 0, list, 0, actualSize);
return list;
}
程序 ThreadViewer.java 以图形方式显示 Java VM 中当前运行的所有线程,它每隔 2 秒自动刷新一次,以保持获得最新信息。程序 ThreadViewer.java 源代码:
-
packagethread;
-
importjava.awt.*;
-
importjava.awt.event.*;
-
importjavax.swing.*;
-
importjavax.swing.table.*;
-
publicclassThreadViewerextendsJPanel{
-
privateThreadViewerTableModeltableModel;
-
publicThreadViewer(){
-
tableModel=newThreadViewerTableModel();
-
JTabletable=newJTable(tableModel);
-
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
-
TableColumnModelcolModel=table.getColumnModel();
-
intnumColumns=colModel.getColumnCount();
-
-
for(inti=0;i<numColumns-1;i++){
-
TableColumncol=colModel.getColumn(i);
-
col.sizeWidthToFit();
-
col.setPreferredWidth(col.getWidth()+5);
-
col.setMaxWidth(col.getWidth()+5);
-
}
-
JScrollPanesp=newJScrollPane(table);
-
setLayout(newBorderLayout());
-
add(sp,BorderLayout.CENTER);
-
}
-
publicvoiddispose(){
-
tableModel.stopRequest();
-
}
-
protectedvoidfinalize()throwsThrowable{
-
dispose();
-
}
-
publicstaticJFramecreateFramedInstance(){
-
finalThreadViewerviewer=newThreadViewer();
-
finalJFramef=newJFrame("ThreadViewer");
-
f.addWindowListener(newWindowAdapter(){
-
publicvoidwindowClosing(WindowEvente){
-
f.setVisible(false);
-
f.dispose();
-
viewer.dispose();
-
}
-
});
-
f.setContentPane(viewer);
-
f.setSize(500,300);
-
f.setVisible(true);
-
returnf;
-
}
-
-
publicstaticvoidmain(String[]args){
-
JFramef=ThreadViewer.createFramedInstance();
-
-
-
f.addWindowListener(newWindowAdapter(){
-
publicvoidwindowClosing(WindowEvente){
-
System.exit(0);
-
}
-
});
-
-
-
Objectlock=newObject();
-
synchronized(lock){
-
try{
-
lock.wait();
-
}catch(InterruptedExceptionx){
-
}
-
}
-
}
-
}
程序 ThreadViewerTableModel.java 源代码:
-
packagethread;
-
importjava.awt.*;
-
importjava.lang.reflect.*;
-
importjavax.swing.*;
-
importjavax.swing.table.*;
-
publicclassThreadViewerTableModelextendsAbstractTableModel{
-
privateObjectdataLock;
-
privateintrowCount;
-
privateObject[][]cellData;
-
privateObject[][]pendingCellData;
-
-
privatefinalintcolumnCount;
-
privatefinalString[]columnName;
-
privatefinalClass[]columnClass;
-
-
privateThreadinternalThread;
-
privatevolatilebooleannoStopRequested;
-
publicThreadViewerTableModel(){
-
rowCount=0;
-
cellData=newObject[0][0];
-
-
String[]names={
-
"Priority","Alive",
-
"Daemon","Interrupted",
-
"ThreadGroup","ThreadName"};
-
columnName=names;
-
-
-
Class[]classes={
-
Integer.class,Boolean.class,
-
Boolean.class,Boolean.class,
-
String.class,String.class};
-
columnClass=classes;
-
columnCount=columnName.length;
-
-
dataLock=newObject();
-
noStopRequested=true;
-
Runnabler=newRunnable(){
-
publicvoidrun(){
-
try{
-
runWork();
-
}catch(Exceptionx){
-
-
x.printStackTrace();
-
}
-
}
-
};
-
internalThread=newThread(r,"ThreadViewer");
-
internalThread.setPriority(Thread.MAX_PRIORITY-2);
-
internalThread.setDaemon(true);
-
internalThread.start();
-
}
-
privatevoidrunWork(){
-
-
-
RunnabletransferPending=newRunnable(){
-
publicvoidrun(){
-
transferPendingCellData();
-
-
-
fireTableDataChanged();
-
}
-
};
-
while(noStopRequested){
-
try{
-
createPendingCellData();
-
SwingUtilities.invokeAndWait(transferPending);
-
Thread.sleep(2000);
-
}catch(InvocationTargetExceptiontx){
-
tx.printStackTrace();
-
stopRequest();
-
}catch(InterruptedExceptionx){
-
Thread.currentThread().interrupt();
-
}
-
}
-
}
-
publicvoidstopRequest(){
-
noStopRequested=false;
-
internalThread.interrupt();
-
}
-
publicbooleanisAlive(){
-
returninternalThread.isAlive();
-
}
-
privatevoidcreatePendingCellData(){
-
-
Thread[]thread=findAllThreads();
-
Object[][]cell=newObject[thread.length][columnCount];
-
for(inti=0;i<thread.length;i++){
-
Threadt=thread[i];
-
Object[]rowCell=cell[i];
-
rowCell[0]=newInteger(t.getPriority());
-
rowCell[1]=newBoolean(t.isAlive());
-
rowCell[2]=newBoolean(t.isDaemon());
-
rowCell[3]=newBoolean(t.isInterrupted());
-
rowCell[4]=t.getThreadGroup().getName();
-
rowCell[5]=t.getName();
-
}
-
synchronized(dataLock){
-
pendingCellData=cell;
-
}
-
}
-
privatevoidtransferPendingCellData(){
-
-
synchronized(dataLock){
-
cellData=pendingCellData;
-
rowCount=cellData.length;
-
}
-
}
-
publicintgetRowCount(){
-
-
returnrowCount;
-
}
-
-
publicObjectgetValueAt(introw,intcol){
-
-
returncellData[row][col];
-
}
-
publicintgetColumnCount(){
-
returncolumnCount;
-
}
-
publicClassgetColumnClass(intcolumnIdx){
-
returncolumnClass[columnIdx];
-
}
-
publicStringgetColumnName(intcolumnIdx){
-
returncolumnName[columnIdx];
-
}
-
publicstaticThread[]findAllThreads(){
-
ThreadGroupgroup=
-
Thread.currentThread().getThreadGroup();
-
ThreadGrouptopGroup=group;
-
-
while(group!=null){
-
topGroup=group;
-
group=group.getParent();
-
}
-
-
-
-
intestimatedSize=topGroup.activeCount()*2;
-
Thread[]slackList=newThread[estimatedSize];
-
-
-
-
intactualSize=topGroup.enumerate(slackList);
-
-
Thread[]list=newThread[actualSize];
-
System.arraycopy(slackList,0,list,0,actualSize);
-
returnlist;
-
}
-
}
http://blog.csdn.net/defonds/article/details/4848853
分享到:
相关推荐
多线程 非阻塞算法 Java 8:使用 CompletableFuture 编写异步代码 Cache-coherency: Basics, MSI(除了文章,博客本身也很有趣) 程序员信奉的 CPU 缓存神话 微服务和架构: 如何设计 Web 应用程序:软件架构 101 ...
到底需要发生什么结果,该工作应该获得一个虚拟机,因为外部库可以通过适当的准则(例如编程语言)以Java进行功能性编程,从而在一个单线程程序演练中完全传播它们,从而在单线程程序中进行演练。 与虚拟机相关的...
� 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...
它扩展了以支持数据/事件序列,并添加了运算符,使您可以声明性地组成序列,同时抽象出对诸如低级线程,同步,线程安全和并发数据结构之类的问题的关注。 零依赖 <1MB的罐子 Java 6+和 2.3+ Java 8 Lambda支持...
在很多 UNIX® 系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化...
为了实现数控系统的网络化, 采用具有平台独立性的Java编程语言, 以Java Applet应用程序为载体, 利用线程技术、多媒体技术、绘图技术和逐点比较法等技术, 解决了仿真过程中的图像闪烁、声音载入等问题, 实现了仿真...
主要技术包括:java基础语法、java⾯向对象(类、对象、封装、继承、多态、 抽象类、接⼝、常见类、内部类、常见修饰符等) 、异常、集合、⽂件、IO、 MYSQL(基本SQL语句操作、多表查询、⼦查询、存储过程、事务、...
Jikes RVM 的一个显着特点是它是用 Java:trade_mark: 编程语言实现的,并且是自托管的,即它的 Java 代码在不需要第二个虚拟机的情况下自行运行。 Java 平台的大多数其他虚拟机都是用本机代码(通常是 C 或 C++)...
11.1.5 解决多线程问题 11.1.6 有趣的超时 11.1.7 使用HttpURLConnection 11.1.8 使用AndroidHttpClient 11.1.9 使用后台线程(AsyncTask) 11.1.10 使用AsyncTask处理配置更改 11.1.11 使用...
11.1.5 解决多线程问题 11.1.6 有趣的超时 11.1.7 使用HttpURLConnection 11.1.8 使用AndroidHttpClient 11.1.9 使用后台线程(AsyncTask) 11.1.10 使用AsyncTask处理配置更改 11.1.11 使用...