我注意到我创建的ExecutorService
对象中的某些线程具有“本机”状态。 “原生”是什么意思?
答案 0 :(得分:6)
在java中,您有两种类型的线程,绿色线程和本机线程。
绿色和本机线程都是支持Java程序多线程执行的机制。一些JDK发行版(例如Blackdown)包含使用任一类型的线程运行的选项。
本机线程使用操作系统的本机功能来管理多线程进程 - 特别是,它们使用pthread库。当您使用本机线程运行时,内核会调度并管理构成该过程的各种线程。
绿色线程模拟多线程环境,而不依赖于任何本机操作系统功能。它们在用户空间中运行代码来管理和调度线程; Sun编写了绿色线程,使Java能够在没有本机线程支持的环境中工作。
在Linux环境中使用这两者之间存在一些重要的区别:
本机线程可以预先在线程之间切换,随时将控制从正在运行的线程切换到非运行线程。绿色线程仅在线程(Thread.yield(),Object.wait()等)明确放弃控制时切换,或者线程执行阻塞操作(read()等)。
在多CPU计算机上,本机线程可以通过为不同的CPU分配不同的线程来同时运行多个线程。绿色线程仅在一个CPU上运行。
本机线程创建许多Java进程正在运行的外观:每个线程在进程表中占用自己的条目。一个线索是这些是同一个进程的所有线程,所有线程的内存大小都相同 - 它们都使用相同的内存。
不幸的是,这种行为限制了Linux上Java的可伸缩性。进程表不是无限大,进程只能在耗尽系统资源或达到配置的限制之前创建有限数量的线程。