区分 Java 线程和操作系统线程?

2022-08-31 20:31:49

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

在Linux中,每个子进程都有父进程,他们说0是所有进程的父进程,所有分叉的Java线程都会有一个父线程吗?

我如何知道哪个Java线程与OS线程相关(如果Java线程缺少本机进程线程)。

Java 线程和操作系统线程是否有任何命名约定?

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


答案 1

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

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

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

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

在操作系统级别,theads没有名字;它们只存在于JVM中。

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


答案 2

没有标准;这完全取决于您使用的Java实现。另外,不要混淆“本机线程”和“本机进程”。进程是一个孤立的实体,无法看到其他进程的地址空间。线程是在本机进程的地址空间中运行的东西,并且可以在相同进程的其他线程的内存中看到。

您在 Linux 上看到的是另一回事:某些版本的 Linux 在进程表中为父进程的每个线程创建一个条目。这些“过程”不是真正的过程(在隔离意义上)。它们是可以与命令一起列出的线程。您可以使用父 PID (PPID) 查找创建它们的进程。ps