Java多线程——Thread的native底层实现
Java多线程
- 当我们去阅读java的Thread类的时候,会发现这个类与大部分的java类库API有着明显的差别,它的所有关键方法都被声明为native。
- native本身指代的就是本地方法,而又由于java线程模型采用基于操作系统原生线程模型,这里默认Thread中
native
方式代指的是Native POSIX Thread Library。 - 线程的实现方式有三种:分别是内核线程实现(1:1实现),使用用户线程实现(1:N),使用用户线程加轻量级进程混合实现(N:M实现)。而Java从1.3开始线程模型普遍采用基于操作系统原生线程模型来实现,即1:1。
- Hotpot自己是不会去干涉线程调度的,可以设置线程优先级给OS提供调度建议。
- Linux把不同的PID与系统中每个进程或轻量级进程相关联。另一方面,一个多线程应用程序中的所有线程只有一个相同的PID。
- 正因为多个线程有相同的PID,所以引入了线程组的概念,而一个线程组中的所有线程使用和该线程组的领先进程相同的PID,也就是该组中第一个轻量级进程的PID,它被存入进程描述符的tgid字段中。
- 有真正意义上的线程,它的实现是由进程来模拟,所以属于用户级线程,位于libpthread共享库。具体到内存中的数据结构,则是进程描述符数据结构中的一个指针指向thread_info,这个就是线程描述符,存储区域大小为两个叶框(2*4K)。
Q&A
- Q1:在一个程序中,代码的不同位置创建的fork(),所以这个程序就是多线程的?
- A:不对,同一个程序创建的fork()创建的程序的多进程的程序,每个fork()之间属于父子进程的关系(父子进程的通信方式可以只允许父子进程通信的方式管道,而FIFO则是允许非父子间进行通信)。
- Q2:一个操作系统最多创建多少个进程,一个进程最多创建多少个线程?
- A:一个操作系统最多创建的进程上线与proc表(linux下
/proc
)的大小有关,而proc
表的大小取决于总线宽度(因为总线宽度决定了指针的个数),比如4G个。 - Q3:如何查看内核线程?
- A:
ps afx
参考博文:
多线程编程小结:https://blog.csdn.net/skyroben/article/details/72793409
《深入理解Java虚拟机:JVM高级特性与最佳实践》
《深入理解linux内核》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix