为什么单个线程的Java程序有这么多线程?

drjrm3

我有一个具有13个线程的Java程序,尽管其中只有一个线程的CPU使用率为99%,并且已经运行了约24小时。其他人的CPU使用率为0.0%,并且显示到TIME+的任何值,从0:00.00:12.82都有3:51.48该程序旨在成为单线程程序,所以我想知道为什么还有其他线程?

他们在做什么,为什么他们的CPU使用率和TIME +这么少?

更新:我有一个旧的Java程序(第一个程序-不要判断我!),它是单线程的,并且显示相同类型的线程用法...

import java.io.*;

class xdriver {
  static int N = 100;
  static double pi = 3.141592653589793;
  static double one = 1.0;
  static double two = 2.0;

  public static void main(String[] args) {
    //System.out.println("Program has started successfully\n");

    if( args.length == 1) {
      // assume that args[0] is an integer
      N = Integer.parseInt(args[0]);
    }   

    // maybe we can get user input later on this ...
    int nr = N;
    int nt = N;
    int np = 2*N;

    double dr = 1.0/(double)(nr-1);
    double dt = pi/(double)(nt-1);
    double dp = (two*pi)/(double)(np-1);

    System.out.format("nn --> %d\n", nr*nt*np);

    if(nr*nt*np < 0) {
      System.out.format("ERROR: nr*nt*np = %d(long) which is %d(int)\n", (long)( (long)nr*(long)nt*(long)np), nr*nt*np);
      System.exit(1);
    }   

    // inserted to artificially blow up RAM
    double[][] dels = new double [nr*nt*np][3];

    double[] rs = new double[nr];
    double[] ts = new double[nt];
    double[] ps = new double[np];

    for(int ir = 0; ir < nr; ir++) {
      rs[ir] = dr*(double)(ir);
    }   
    for(int it = 0; it < nt; it++) {
      ts[it] = dt*(double)(it);
    }   
    for(int ip = 0; ip < np; ip++) {
      ps[ip] = dp*(double)(ip);
    }   

    double C = (4.0/3.0)*pi;
    C = one/C;

    double fint = 0.0;
    int ii = 0;
    for(int ir = 0; ir < nr; ir++) {
      double r = rs[ir];
      double r2dr = r*r*dr;
      for(int it = 0; it < nt; it++) {
        double t = ts[it];
        double sint = Math.sin(t);
        for(int ip = 0; ip < np; ip++) {
          fint += C*r2dr*sint*dt*dp;

          dels[ii][0] = dr; 
          dels[ii][1] = dt; 
          dels[ii][2] = dp; 
        }   
      }   
    }   

    System.out.format("N ........ %d\n", N); 
    System.out.format("fint ..... %15.10f\n", fint);
    System.out.format("err ...... %15.10f\n", Math.abs(1.0-fint));
  }
}
哈格罗瓦尔

引用这里进行的讨论和其他研究。

几个核心JVM线程:

  1. 附加侦听器:这是一个始终侦听其他JVM线程以发送请求的线程。一个实际的例子是进行概要分析或(例如,与我无关)生产级别的应用程序监视工具,例如DynaTrace。
  2. 信号分配器:当OS向JVM发出信号时,信号分配器线程会将信号传递给适当的处理程序。
  3. 引用处理程序:高优先级线程以排队待处理的引用。GC创建了一个简单的引用链接列表,该列表需要处理,该线程将它们快速添加到适当的队列中,并通知ReferenceQueue侦听器。
  4. 终结器:终结器线程调用终结器方法。
  5. DestroyJavaVM:该线程在程序退出时卸载Java VM。大多数时候它应该等待。
  6. 垃圾收集器:负责Java垃圾收集机制的线程,具体取决于是否启用了GC。
  7. main:运行程序包含main方法的主线程

其中一个重要的一点要注意的是,这将取决于JVM实现,多少和哪些所有核心线程就会启动,但即使Java程序被写入是单线程的,也就会JVM多个线程。

Java程序可以是单线程的,但是JVM(将运行用户定义的Java程序)是多线程的,并且甚至从一开始就具有多个线程(至少是最新JVM)。

下面是运行单个线程Java程序的Java HotSpot(TM)客户端VM版本24.55-b03的快照:

回答您的查询

他们在做什么,为什么他们的CPU使用率和TIME +这么少?

是什么: JVM是出于特定目的而启动的,如上所述,就像JVM要侦听任何概要分析或监视程序是否要从JVM获取一些详细信息一样。
原因:由于它们实际上未处于活动状态或正在运行,因此处于等待或停放状态(请参阅附加快照中的黄线,如果您有GUI监视应用程序,则还应该看到黄线,否则,如果命令行,则进入WAIT状态),因此它们不占用任何或最少的CPU周期,因此占用的CPU更少。再次TIME+会向您显示它们处于活动状态的时间,并且由于它们未处于活动状态,因此此参数也会更少。

希望这可以帮助!

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么会有这么多TIMED_WAITING线程?

为什么scikit-learn中的GridSearchCV产生这么多线程

为什么会有这么多“已删除但未清除”的程序包?

Python:为什么等待线程占用这么多 CPU

为什么/ dev中有这么多设备?

为什么会有这么多的回送地址?

为什么有这么多python版本在使用?

ActionCable:为什么有这么多连接?

为什么会有这么多sidekiq进程?

为什么“ git index”有这么多名称?

为什么Java源代码彼此之间有这么多文件夹?

在Java中为什么有这么多的日期和时间处理功能

为什么在java中有这么多获取日期时间的方法?

为什么有这么多 ES java 客户端?

为什么本例中的Python多线程这么慢?

当我有这么多RAM时,为什么我的系统这么慢?

当我刚打开应用程序时,为什么Chrome有这么多正在运行的进程?

为什么这个多线程程序是 Segfaulting?

多线程程序花费的时间比单个线程(JAVA)

HTTP / 2的协议ID是什么,为什么有这么多?

为什么Java多线程代码死锁

Java的多线程程序

为什么有这么多 ubuntu 发行版

为什么在钥匙串的私钥部分中有这么多的iMessage签名密钥?

为什么对同一个函数有这么多调用?

为什么我有这么多REPOSITORY name = <none>的Docker映像?

为什么在F#中有这么多针对不同类型的`map`函数

为什么matplotlib有这么多的“制作”图选项?

为什么 Python 中有这么多的格式化风格?