为什么单线程java程序有这么多线程?

前端之家收集整理的这篇文章主要介绍了为什么单线程java程序有这么多线程?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 java程序,它有13个线程,但只有一个是99%的cpu使用率并且已经运行了大约24小时.其他人的cpu使用率为0.0%,显示TIME为0:00.0到0: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));
  }
}

解决方法

引用 here和其他研究完成的讨论.

几个核心JVM线程:

> Attach Listener:这是一个总是侦听其他JVM线程发送请求的线程.一个实际的例子是在分析或(我不是这个)生产级应用程序监视工具如DynaTrace的情况下.
>信号调度程序:当操作系统向JVM发出信号时,信号调度程序线程会将信号传递给适当的处理程序.
>引用处理程序:用于将待处理引用排入队列的高优先级线程. GC创建一个简单的链接引用列表,需要进行处理,并且该线程会快速将它们添加到正确的队列中,并通知ReferenceQueue侦听器.
> Finalizer:Finalizer线程调用终结器方法.
> DestroyJavaVM:该线程在程序退出时卸载Java VM.大多数时候它应该等待.
>垃圾收集器:负责Java垃圾收集机制的线程,具体取决于是否启用了GC.
> main:运行包含main方法的程序的主线程.

需要注意的一点是,它将依赖于JVM实现它将启动多少以及所有核心线程,但即使Java程序被编写为单线程,JVM中也会有多个线程.

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

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

回答你的问题

What are they doing and why do they show so little cpu usage and
TIME+?

什么部分:JVM开始出于某种目的,如上所述,如果任何分析或监视程序想要从JVM获取某些细节,JVM想要监听.
为什么部分:因为它们真的不活动或正在运行,它们处于等待或停放状态(参见我附加快照中的黄色线程,如果你有一个GUI监控应用程序,那么你也应该看到黄色,否则如果命令行然后线程进入等待状态)因此它们不占用任何或最少的cpu周期,因此cpu使用率较低.
TIME会再次显示它们处于活动状态的时间,并且由于它们不是,因此该参数也较少.

希望这可以帮助!

原文链接:https://www.f2er.com/java/127426.html

猜你在找的Java相关文章