区分Java线程和OS线程?

区分Java线程和OS线程?,java,linux,jvm,multithreading,posix,Java,Linux,Jvm,Multithreading,Posix,如何区分运行的Java线程和本机线程 在Linux中,每个子进程都有父进程,他们说0是所有进程的父进程,所有分叉的Java线程都有父线程吗 我如何知道哪个Java线程与OS线程相关(如果Java线程分叉于本机进程线程) Java线程和OS线程是否有命名约定 运行的Java线程是否可以从另一个Java代码挂起或终止?没有标准;这完全取决于您使用的Java实现。另外,不要混淆“本机线程”和“本机进程”。进程是一个孤立的实体,无法看到其他进程的地址空间。线程是在本机进程的地址空间中运行的,并且可以查看

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

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

我如何知道哪个Java线程与OS线程相关(如果Java线程分叉于本机进程线程)

Java线程和OS线程是否有命名约定


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

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


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

在Linux上,Java线程是用本机线程实现的,因此使用线程的Java程序与使用线程的本机程序没有什么不同。“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。它应该提到“本机POSIX线程库”或linuxthreads。C库的路径因系统而异:它可能是
/lib/libc.so.6
/lib64/libc.so.6
(在基于64位RedHat的系统上),或者类似
/lib/x86_64-linux-gnu/libc.so.6
(在基于现代Debian的系统上,如Ubuntu)

在操作系统级别,thead没有名称;这些仅存在于JVM中


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

没有通用的解决方案来解决如何将Java线程映射到操作系统线程(如果有的话)。每一个JVM实现都可以用不同的方式实现它

还有一个纯Java线程实现,称为。如果本机线程不受支持或系统根本不是多线程的,这将用作回退。在操作系统上看不到任何绿色线程

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

如果它们在同一个JVM上运行,则是,使用stop()。但这不是一个好的解决方案,可能有效,也可能无效。interrupt()允许线程安全地自行关闭

据我所知,没有办法杀死JVM之外的线程。如果一个操作系统真的支持终止线程,我就不会期望Java应用程序在之后能够正确运行

可以运行Java线程吗 从另一个Java暂停或终止 密码

理论上是的。实际上,不推荐使用
Thread.kill()
Thread.suspend()
方法,因为它们在非常有限的情况下是不安全的。基本的问题是,杀死或挂起java线程可能会使其他线程依赖于它,以及可能在更新过程中的共享数据结构。


如果“另一个Java代码”意味着另一个JVM,那么它工作的机会就更少了。即使您知道如何发送相关的线程信号,结果也是完全不可预测的。我打赌“目标”JVM会崩溃。

Stephen C,我正在学习Linux线程命名和Java线程命名是如何相互关联的。还有,在Linux中如何管理JVM线程管理。谢谢Wyard,我可以命名运行线程并查询运行线程的详细信息吗?我是从调试的角度来问的。线程的“名称”是特定于Java的;要查看此类信息,您必须使用调试器连接到JVM。从JVM外部,您只能看到它的数字ID,从POSIX的角度来看,这是它唯一的标识符?如果我将探查器或调试器连接到正在运行的JVM,我是否能够获取正在运行的Java线程名称并提供给Shell脚本?“您可以使用它尝试从JVM外部杀死该特定线程”-您可以使用
pthread\u kill
仅向与信号发送器在相同上下文上运行的线程发送信号。从
man pthread_kill(3)
“pthread_kill()函数将信号sig发送到线程,该线程与调用程序处于同一进程中…”您可以从Java代码中执行Linux命令,以杀死在特定JVM下运行的特定线程。您甚至可以在Windows上执行此操作。但我想你可能是对的,这将导致该线程的JVM崩溃。如果您同时控制这两个程序,您可能应该开发某种IPC调用来告诉