2

我注意到ExecutorService我创建的对象中的一些线程具有“本机”状态。“原生”是什么意思? 在此处输入图像描述

4

1 回答 1

6

在java中,你有两种类型的线程,绿色线程和本机线程。

绿色线程和本机线程都是支持 Java 程序多线程执行的机制。一些 JDK 发行版(例如 Blackdown 的)包括使用任一类型的线程运行的选项。

本机线程使用操作系统的本机能力来管理多线程进程 - 特别是,它们使用 pthread 库。当您使用本机线程运行时,内核会调度和管理组成进程的各种线程。

绿色线程模拟多线程环境,不依赖任何本机操作系统功能。他们在管理和调度线程的用户空间中运行代码;Sun 编写了绿色线程以使 Java 能够在没有本地线程支持的环境中工作。

在 Linux 环境中使用这两者有一些重要的区别:

原生线程可以在线程之间抢先切换,随时将控制权从正在运行的线程切换到非运行的线程。仅当线程(Thread.yield()、Object.wait() 等)显式放弃控制或线程执行阻塞操作(read() 等)时,绿色线程才会切换。

在多 CPU 机器上,通过将不同的线程分配给不同的 CPU,本地线程可以同时运行多个线程。绿色线程仅在一个 CPU 上运行。

本机线程创建了许多 Java 进程正在运行的外观:每个线程在进程表中占用自己的条目。这些都是同一进程的所有线程的一个线索是所有线程的内存大小都是相同的——它们都使用相同的内存。

不幸的是,这种行为限制了 Java 在 Linux 上的可扩展性。进程表不是无限大的,进程在耗尽系统资源或达到配置限制之前只能创建有限数量的线程。

于 2013-01-24T14:19:24.810 回答