线程堆:给你的线程命名,察看你的系统

开发环境(IDE)能给图形界面应用程序提供一个很好的调试工具,但是它却不能调试一个多线程的Java服务器程序。

幸运的是,有几种工具,例如logging应用程序接口(API)或者Java Debugger可以用来调试Java服务器程序。开发者还能使用一个系统的线程堆在任何时候观察系统的状态。

运行服务器,然后按[ctrl] [/],会运行一个系统线程堆,这样将输出当前运行的所有线程,例如:

^\Full thread dump:

Thread-1" prio=5 tid=0x87fe0 nid=0x800013b8 waiting on monitor [0..0xbfffe9f8]

"Thread-0" prio=5 tid=0xafde0 nid=0x72a00 runnable [0x173f000..0x173fb48]

at java.net.PlainSocketImpl.socketAccept(Native Method)

at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:421)

at java.net.ServerSocket.implAccept(ServerSocket.java:243)

at java.net.ServerSocket.accept(ServerSocket.java:222)

at com.generationjava.net.PortListener.run(PortListener.java:38)

at java.lang.Thread.run(Thread.java:496)

"Signal Dispatcher" daemon prio=10 tid=0xa5f80 nid=0x52af0 waiting on monitor [0..0]

"Finalizer" daemon prio=8 tid=0xa46c0 nid=0x4d930 waiting on monitor [0x10a8000..0x10a8b48]

at java.lang.Object.wait(Native Method)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:108)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:123)

at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:162)

"Reference Handler" daemon prio=10 tid=0xa3b70 nid=0x4cca0 waiting on monitor [0x1027000..0x1027b48]

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:420)

at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:110)

"VM Thread" prio=5 tid=0xa2de0 nid=0x4ca20 runnable

"VM Periodic Task Thread" prio=10 tid=0xa56b0 nid=0x52890 waiting on monitor

后面的四个线程是标准线程,而其他的则跟运行的服务器程序有关。这两个线程被命名为Thread-1和Thread-0,如果用Thread th = new Thread(runnable,"Server")代替Thread th = new Thread(runnable)去创建进程,你就可以命名自己要创建的线程。

另外,如果你调用java.lang.Thread的setName(String)方法,你也能命名你的线程,并且可以很容易从线程堆的输出中发现原来的Thread-0是服务器程序。

"Server" prio=5 tid=0xafde0 nid=0x72a00 runnable [0x173f000..0x173fb48]

而原来的Thread-1线程现在变成了Thread-0。

通过命名线程和取得线程堆,开发者就能看到Java虚拟机(JVM)的内部状态。如果想得到更多信息的话,你就得去研究Java Debugger了。

时间: 2024-08-14 11:07:22

线程堆:给你的线程命名,察看你的系统的相关文章

3线程的终止方式,线程属性,NPTL

 1线程终止方式 如果需要只终止某个线程而不终止整个线程,可以有三种方法: A:从主线程函数return.这种方法对主线程不适合,从main函数return相当于调用exit. B:一个线程可以调用pthread_cancel终止同一进程中的另一个线程. C:线程可以调用pthread_exit终止自己   同一个进程的线程间,pthread_cancel向另一个线程发终止信号.系统不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程.或调用pthread_testcan

main-java 子线程结束结束 内部子线程也结束 具体看代码注释

问题描述 java 子线程结束结束 内部子线程也结束 具体看代码注释 import java.util.ArrayList; import org.junit.Test; /** 代码很简单的 就是起了一个线程 然后在一个list里面放了1000个数字 然后打印以下 但是test方法 用junit起的 不能完全打印 而main可以 最终是想要使得这个test方法能和main的效果一样 * */ public class TestSub { @Test public void test() { /

vc++-信号量和线程同步的问题:线程函数比较耗时

问题描述 信号量和线程同步的问题:线程函数比较耗时 void trigger() { UINT uWait=::WaitForSingleObject(IEvent,INFINITE); if ( uWait == WAIT_OBJECT_0 ) { processA(); } } processA(); 比较耗时,如果它还没有跑完,下一个触发又来了,就马上又开始执行一个processA(); 吗,还是等待上次的执行完成然后再执行? 解决方案 PC机上会出现乱序或是假死,也就是说有可能后发的先做

深入浅出多线程(5)以并行包线程池为例说说线程池的设计需求及使用

接深入浅出多线程系列4, 线程对象的创建和销毁是需要花费系统资源的,通过线程池,可以避免该问 题并提高系统的响应时间.这种情形类似我们常提到的数据库连接池. 线程池的广泛应用使得在SUN在JDK 1.5的工具包提供了线程池的支持.我计 划将该系列分为设计需求与设计实现两个部分.这样会更加清晰.如果想要熟悉 ,并熟练应用线程池,那么通过设计需求篇也就是该篇就可以找到答案.如果想 探究实现的细节,那么在设计实现篇会有深入的说明. 本文以Concurrent包线程池设计为例,讨论线程池的设计. 线程池

C#线程系列讲座(3):线程池和文件下载服务器

如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一 定程序上消耗服务器的资源.为此,一个最好的解决方法就是在服务器启动之前 ,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中 获得线程对象,并处理请求.保存这些线程对象的结构就叫做线程池. 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下, ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不

线程管理(一)线程的创建和运行

线程的创建和运行 在这个指南中,我们将学习如何在Java程序中创建和运行线程.与每个Java语言中的元素一样,线程是对象.在Java中,我们有2个方式创建线程: 通过直接继承thread类,然后覆盖run()方法. 构建一个实现Runnable接口的类, 然后创建一个thread类对象并传递Runnable对象作为构造参数 在这个指南中,我们将使用第二种方法来制作一个简单的程序,它能创建和运行10个线程.每一个线程能计算和输出1-10以内的乘法表. 准备 指南中的例子是使用Eclipse IDE

mfc循环创建的多线程A去调用了另外一个线程B,其中A线程出问题要退出。

问题描述 mfc循环创建的多线程A去调用了另外一个线程B,其中A线程出问题要退出. mfc循环创建的多线程A去调用了另外一个线程B,其中A的一个线程出问题要退出.B线程怎么也终止了 怎么办?用的是下面这个. // 资源释放结束,可退出线程并析构类 pMg->m_ExitThread.SetEvent();

c++中如何将子线程的参数传回主线程

问题描述 c++中如何将子线程的参数传回主线程 1C DWORD WINAPI threadFunction(LPVOID pArg) //返回值进程id(dword类型) 参数类型 LPVOID{ tNum myNum = *((tNum *)pArg); //将参数转化成int型 EnterCriticalSection(&gCS); // 进入临界区 myNum.string_back = FuzzyHash(myNum.string_in); LeaveCriticalSection(&a

java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]

线程通信,线程之间的消息传递: 多个线程在操作同一个资源,但对共享资源的操作动作不同:它们共享同一个资源,互为条件,相互依赖,相互通信让任务向前推进. 线程的同步,可以解决并发更新同一个资源,实现线程同步;但不能用来实现线程间的消息传递. 线程通信生产者和消费者和仓库是个典型模型: 生产者:没有生产之前通知消费者等待,生产产品结束之后,马上通知消费者消费 消费者:没有消费之前通知生产者等待,消费产品结束之后,通知生产者继续生产产品以供消费 线程通信:使用java中Object中提供的: publ