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

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

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

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

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

推荐答案

在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_kill()C函数可以用来向特定线程发送信号,你可以用它从JVM外部杀死特定线程,但我不知道JVM会如何响应.它可能会杀死整个JVM.

Linux相关问答推荐

C++17:G++8.5版似乎无法正确生成无符号64位伪随机整数

pci_user_write_config_word在哪里实现?

加载ELF64头文件为什么会导致分段错误?

使用sed命令将记录中的字符串替换为DD-MMM-YYYY日期格式

重新运行时避免 Linux bash 脚本中的文件重命名重复

在 Rust 中重命名主线程

SessionNotCreatedException:无法启动新会话.响应代码 500 在远程服务器上的 Apache Tomcat/10.0.23 上使用 ChromeDriver

matlab中linux和windows上regexp()的不同行为

Bash - 如何根据 names.txt 重命名目录中的文件

如何使用换行符或制表符或空格 grep 多行字符串

如何在makefile中包含静态库

在 Bash 中从最后到第一个输出文件行

使用 shell 脚本获取 MAC 地址

如何测试是否存在两个文件?

C.UTF-8 和 en_US.UTF-8 语言环境有什么区别?

为什么 mmap() 比顺序 IO 快?

如何在第一个错误时停止 xargs?

Docker Volume 没有挂载任何文件

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

如何计算一个单词在目录的所有文件中出现的次数?