Java 为什么占用的内核数高于线程池大小?

Java 为什么占用的内核数高于线程池大小?,java,multithreading,Java,Multithreading,Java程序占用的内核数高于线程池的大小,这有什么原因吗?我将线程池的大小指定为4,但过了一段时间后,我发现我的java代码占用了6或7个内核(即顶部显示600个)。这台机器上有8个磁芯。是我做错了什么,还是java决定在执行多线程处理时自动使用其他未使用的内核?如果是,有没有办法强制多线程期间使用的内核数 我正在使用的代码如下所示: ExecutorService executor = Executors.newFixedThreadPool(4); for (int i = 0; i <

Java程序占用的内核数高于线程池的大小,这有什么原因吗?我将线程池的大小指定为4,但过了一段时间后,我发现我的java代码占用了6或7个内核(即顶部显示600个)。这台机器上有8个磁芯。是我做错了什么,还是java决定在执行多线程处理时自动使用其他未使用的内核?如果是,有没有办法强制多线程期间使用的内核数

我正在使用的代码如下所示:

ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < N; i++) {
   executor.execute(do something);                
}
executor.shutdown();
while (!executor.isTerminated()) {}
ExecutorService executor=Executors.newFixedThreadPool(4);
对于(int i=0;i
JVM使用多个系统线程,如终结器线程。运行jconsole,连接到您的跑步应用程序,转到“线程”选项卡,您将看到所有正在运行的线程。或者将此代码添加到您的应用程序中

    for(Thread t : Thread.getAllStackTraces().keySet()) {
        System.out.println(t);
    }

可能是GC线程吗?旁注:您应该使用.4 runnable加上GC加主线程。我明白了。如果它是GC和主线程,那么它是有意义的。一个java程序可以有多少个GC线程?只需添加一个有趣的观察:top显示的cpu使用率百分比高于内核数。:)@evegeny这只显示JVM创建的线程。例如,上面打印了5个线程,但任务管理器显示了进程的10个线程。其余的线程是不是不是由JVM创建的本机线程?@gammay当我们从jconsoleI连接到JVM时,额外的线程是由JMX代理创建的。我没有使用jconsole。我刚刚运行了一个示例Java程序,注意到任务管理器(我使用Windows)中的线程数,我这样说:这些额外的本机线程是由JVM启动的线程,但没有映射到Java线程