首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的Java示例使用14个线程运行。为什么?

简单的Java示例使用14个线程运行。为什么?
EN

Stack Overflow用户
提问于 2011-10-09 02:26:24
回答 3查看 6.4K关注 0票数 14

下面是简单的Java代码:

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Start");
        Thread.sleep(5000);
        System.out.println("Done");
    }
}

使用14个线程运行。我知道有一些GC线程在后台运行,但是其他线程是用来做什么的呢?为什么有这么多线程?我在Gentoo Linux上安装了Java 1.6.0_26。使用Eclipse的编译器或javac进行编译不会有什么不同(在Eclipse中以调试模式运行它会多添加3个线程,但这可能是合理的)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-09 02:31:12

默认情况下,我的JVM (1.6.0_26)会产生更多的线程。大多数都有很好的描述性名称,暗示了它们的用途:

代码语言:javascript
复制
"Attach Listener" daemon prio=10 tid=0x0000000041426800 nid=0x2fb9 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Low Memory Detector" daemon prio=10 tid=0x00007f512c07e800 nid=0x2fa3 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007f512c07b800 nid=0x2fa2 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007f512c078800 nid=0x2fa1 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007f512c076800 nid=0x2fa0 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007f512c05a000 nid=0x2f9f in Object.wait() [0x00007f512b8f7000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007c14b1300> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
    - locked <0x00000007c14b1300> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x00007f512c058000 nid=0x2f9e in Object.wait() [0x00007f512b9f8000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007c14b11d8> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
    - locked <0x00000007c14b11d8> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x0000000041401800 nid=0x2f94 waiting on condition [0x00007f5135735000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at Main.main(Main.java:5)

"VM Thread" prio=10 tid=0x00007f512c051800 nid=0x2f9d runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x0000000041414800 nid=0x2f95 runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f512c001000 nid=0x2f96 runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f512c002800 nid=0x2f97 runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f512c004800 nid=0x2f98 runnable 

"GC task thread#4 (ParallelGC)" prio=10 tid=0x00007f512c006800 nid=0x2f99 runnable 

"GC task thread#5 (ParallelGC)" prio=10 tid=0x00007f512c008000 nid=0x2f9a runnable 

"GC task thread#6 (ParallelGC)" prio=10 tid=0x00007f512c00a000 nid=0x2f9b runnable 

"GC task thread#7 (ParallelGC)" prio=10 tid=0x00007f512c00c000 nid=0x2f9c runnable 

"VM Periodic Task Thread" prio=10 tid=0x00007f512c089000 nid=0x2fa4 waiting on condition 

显然,大多数线程都与内存处理有关:有8个垃圾收集器线程,外加内存不足检测器。FinalizerReference Handler听起来像是也参与了内存管理。

C2 CompilerThread0/1几乎肯定与即时编译有关。

这里解释了VM Periodic Task ThreadWhat is the "VM Periodic Task Thread"?

至于剩下的线程的确切用途,我不确定。

票数 15
EN

Stack Overflow用户

发布于 2011-10-09 02:29:26

我用jvisualvm制作了这个截图。运行线程(在eclipse中):

运行与*.jar文件相同的程序;只有4个守护进程线程和1个活动线程在运行。

票数 5
EN

Stack Overflow用户

发布于 2011-10-09 17:19:47

当您通常运行Java程序时,它在虚拟机上运行。您看到的一些线程是用于VM的--要么是为了VM的功能,要么是为了提高效率(编译器线程--当找到一个潜在的优化候选者(称为“热点”)时,这些线程将把它从Java Byte代码编译成运行JVM的平台的机器码)。

大多数其他线程用于内存管理。有这么多可以提供更好的用户体验(如果垃圾收集更快完成,UI /界面将挂起较短的时间)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7698861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档