区分Java线程和OS线程?
如何区分正在运行的Java线程和本地线程?
在Linux中,每个subprocess都有父进程,并且他们说0是所有进程的父进程,所有分叉的Java线程的父进程是否会有?
如何知道哪个Java线程与OS线程相关(如果Java线程阻塞了本机进程线程)。
Java线程和操作系统线程是否有任何命名约定?
一个正在运行的Java线程可以被另一个Java代码挂起或者死亡吗?
在Linux上,Java线程是用本地线程来实现的,所以使用线程的Java程序和使用线程的本地程序没有区别。 “Java线程”只是一个属于JVM进程的线程。
在现代Linux系统(使用NPTL的系统)上,属于一个进程的所有线程具有相同的进程ID和父进程ID,但具有不同的线程ID。 您可以通过运行ps -eLf
来查看这些ID。 PID列是进程ID,PPID列是父进程ID,LWP列是线程(LightWeight进程)ID。 “主”线程具有与进程ID相同的线程ID,而其他线程将具有不同的线程ID值。
较老的Linux系统可能使用不完全符合POSIX的“linuxthreads”线程实现,而不是NPTL。 在linuxthreads系统上,线程有不同的进程ID。
您可以通过将系统的C库(libc)作为独立程序运行并查看其输出中的“可用扩展名”来检查您的系统是否正在使用NPTL或linuxthreads。 它应该提到“本地POSIX线程库”或linuxthreads。 C库的path因系统而异:它可能是/lib/libc.so.6
(在基于64位RedHat的系统上)或类似于/lib/x86_64-linux-gnu/libc.so.6
(在基于Debian的现代系统上,例如Ubuntu)。
在操作系统层面,这些人没有名字; 那些只存在于JVM中。
pthread_kill()
C函数可以用来发送一个信号给特定的线程,你可以用它来试图从JVM之外杀死那个特定的线程,但是我不知道JVM会如何回应它。 它可能会杀死整个JVM。
没有标准; 这完全取决于你正在使用的Java实现。 另外,不要混淆“本地线程”和“本地进程”。 进程是一个孤立的实体,不能看到其他进程的地址空间。 线程是在本地进程的地址空间中运行的东西,它可以看到同一进程的其他线程的内存。
你在Linux上看到的是另外一些东西:某些版本的Linux在父进程的每个线程的进程表中创build一个条目。 这些“过程”不是真正的过程(从隔离的angular度)。 它们是可以用ps
命令列出的线程。 您可以使用父PID(PPID)find创build它们的过程。
Java线程如何映射到操作系统线程,没有通用的解决scheme。 每个JVM实现都可以用不同的方式来完成。
还有一个纯粹的Java线程实现,称为绿色线程 。 如果原生线程不受支持或者系统根本不是multithreading的,则用作后备。 你不会在你的操作系统上看到任何绿色的线程。
一个正在运行的Java线程可以被另一个Java代码挂起或者死亡吗?
如果它们在同一个JVM上运行,那么是,使用stop()。 但这不是一个好的解决scheme,可能工作,或不。 interrupt()允许线程安全地closures。
无法杀死我知道的JVM之外的线程。 如果一个操作系统真的支持线程的查杀,我不会期望Java应用程序能够正常运行!
一个正在运行的Java线程可以被另一个Java代码挂起或者死亡吗?
理论上是的。 在实践中, Thread.kill()
和Thread.suspend()
方法被弃用,因为它们在非常有限的情况下是不安全的。 基本的问题是,杀死或挂起一个Java线程可能会扰乱依赖于它的其他线程,并共享可能在更新中的数据结构。
如果“另一个Java代码”意味着另一个JVM,那么它的工作机会就更小了。 即使你想出了怎样发送相关的线程信号,结果也是完全不可预知的。 我敢打赌,“目标”JVM会崩溃。