java - 为什么一个单线程的java程序有这么多线程?

标签 java multithreading

我有一个有 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));
  }
}

最佳答案

启动 Java 程序意味着启动 JVM 并告诉它运行哪个主类(通常有一个静态主方法)。

除了上面提到的主线程之外,这个 JVM 还产生了几个后台线程。

其中有

  • VM 线程:一个观察线程,等待需要 VM 处于安全点的任务。例如,有一个完全“停止世界”的垃圾收集任务。但还有其他人。
  • GC 线程:为运行垃圾收集而维护的几个线程。
  • 编译线程:这些线程用于将字节码编译成本地机器码。

可能还有更多。

此外,如果您使用的是 AWT 或 Swing,您将从这些框架中获得更多线程。其中之一是所谓的事件调度程序线程 (EDT)。而且 - 当然 - 可能有您创建并运行的线程:计时器、执行程序或只是一些任意线程。即使对于一个简单的 hello world 应用程序,也可能有十几个线程在运行。

但是这些线程中的大多数更多的是等待而不是做某事。因此很有可能只有一个线程真正工作,从而占用了一些 CPU。

虽然 ... 100% 的 CPU 使用率可能表明存在某些问题。例如,一个永无止境的循环。您必须使用探查器来找出真正发生的事情。但它可能只是一个具有这种 CPU 使用率的程序。您的判断。

关于java - 为什么一个单线程的java程序有这么多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31029207/

相关文章:

java - 从终止当前面板的另一个类(方法)的面板调用方法

java - 使用Runnable进行并行执行

java - Spring mvc maven - 添加库

java - 应用程序需要 JRE 版本

java - 以下代码是否线程安全

c# - Mono:是否支持更改线程的优先级?

c# - 具有相同连接字符串的某些连接会发生什么?

c++ - Mutex 无法获取锁

java - 并发创建动态线程数

java - 无法在 sql 上添加或更新子行