java - Java线程和操作系统线程的区别?

标签 java linux jvm multithreading posix

如何区分正在运行的 Java 线程和 native 线程?

在Linux中,每个子进程都会有一个父进程,他们说0是所有进程的父进程,那么所有fork出来的Java线程都会有一个父线程吗?

我如何知道哪个 Java 线程与操作系统线程相关(如果 Java 线程派生了 native 进程线程)。

Java线程和OS线程有什么命名约定吗?

可以从另一个 Java 代码中挂起或终止正在运行的 Java 线程吗?

最佳答案

在Linux上,Java线程是用 native 线程实现的,因此使用线程的Java程序与使用线程的 native 程序没有什么不同。 “Java 线程”只是属于 JVM 进程的线程。

在现代 Linux 系统(使用 NPTL 的系统)上,属于一个进程的所有线程都具有相同的进程 ID 和父进程 ID,但线程 ID 不同。您可以通过运行 ps -eLf 来查看这些 ID。 PID 列是进程 ID,PPID 列是父进程 ID,LWP 列是线程(轻量级进程)ID。 “主”线程具有与进程 ID 相同的线程 ID,其他线程将具有不同的线程 ID 值。

较旧的 Linux 系统可能使用“linuxthreads”线程实现来代替 NPTL,该实现不完全符合 POSIX 标准。在 linuxthreads 系统上,线程具有不同的进程 ID。

您可以通过将系统的 C 库 (libc) 作为独立程序运行并在其输出中查看“可用扩展”来检查您的系统是否正在使用 NPTL 或 linuxthreads。它应该提到“Native POSIX Threads Library”或 linuxthreads。 C 库的路径因系统而异:可能是 /lib/libc.so.6/lib64/libc.so.6(在基于 64 位 RedHat 的系统上)或类似 /lib/x86_64-linux-gnu/libc.so.6(在基于 Debian 的现代系统,例如 Ubuntu)。

在操作系统级别,theads 没有名字;这些仅存在于 JVM 中。

pthread_kill() C 函数可用于向特定线程发送信号,您可以使用该信号尝试从 JVM 外部终止该特定线程,但我不知道 JVM 将如何响应它。它可能会杀死整个 JVM。

关于java - Java线程和操作系统线程的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41795068/

相关文章:

linux - 以编程方式列出子网中的所有设备

java - 如何进行heap dump?

java - Mockito异常: org.mockito.exceptions.misusing.InvalidUseOfMatchersException

linux - make gnu - 并行运行目标

java - Spring JPA Repository 上的 API 数量是否会影响启动时间?

java - Fedora OpenJDK 设置 JAVA_HOME

.net - 64 位 CLR 可以使用压缩指针吗?

java - JVM 指令集 CPU 周期和字节大小

Java编译错误-continue不能在循环外使用

java - 用于 Android 开发的 IntelliJ IDEA IDE