前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java线程与内核线程

Java线程与内核线程

作者头像
书唐瑞
发布于 2022-06-02 06:46:17
发布于 2022-06-02 06:46:17
1.1K00
代码可运行
举报
文章被收录于专栏:Netty历险记Netty历险记
运行总次数:0
代码可运行

本篇文章探究下Java线程与内核线程的关系. 在Java中,一个Java的线程对应一个内核的线程,实际的业务代码是由内核线程来执行的,而Java线程只是一个傀儡. 先通过一个简单的实验热热

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.Thread;
public class Example {
    public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(20000);//休眠20秒
                } catch(Exception x) {}
                System.out.println("Thread-A");
            }
        }, "Thread-A").start();

        Thread.sleep(60000);
        System.out.println("main");
    }
}

以上代码,主要就是要让Thread-A线程先退出,然后JVM再退出.

观察下Thread-A线程退出之后,对应的内核线程是否也退出了. 为了观察现象,使用到一个JDK自带的jvisualvm图形化工具和ps命令.

编译并运行

首先使用jvisualvm观察下线程的情况

说明: 进程ID=686

Thread-A线程在运行完成之后,就退出了,这里看到的线程是Java层面的线程,那么我们通过ps命令看下内核层面的线程情况. 分别在Thread-A线程运行中和运行完成之后,通过ps -Lf 命令查看下线程.

在Thread-A线程结束之后,对应的有个内核线程707也消失了,那么这个内核线程707是不是就是对应Java的Thread-A线程呢?

我们是使用strace -ff -o out java Example命令运行的程序,因此它会打印系统调用相关的信息.

707内核线程打印了Thread-A, 也就是说,内核线程707对应Java的Thread-A线程. 【总结】 当Java的线程退出之后,对应的内核线程也会退出.

当然,以上是我们根据现象观察出来的结果,那么接下来我们通过查看JVM源码看一下.

在Java中调用start方法启动线程, 底层映射到JVM中的JVM_StartThread方法.

接下来继续调用创建逻辑.

调用os::create_thread(this, thr_type, stack_sz)继续创建线程逻辑.

底层调用C库的pthread_create创建内核线程.

创建完成之后, 子线程执行java_start方法,而父线程暂时阻塞住.

子线程唤醒父线程,然后子线程阻塞住. 父线程被唤醒之后,执行start方法.

父线程唤醒之前阻塞的子线程

子线程被唤醒之后,执行JVM中线程的run方法

最后子线程会调用执行Java线程的run方法.

同时当Java线程的run方法执行完成之后, 线程就调用exit退出了. 这里也就解释了Java线程退出之后,内核线程也会退出的原因了. 这里附一张全貌图

总结一下就是父线程创建了子线程, 子线程执行完成之后,子线程就自动退出了. 为了创建线程,对于我们JDK层面就是一个Thread类对象,但是其实JVM内部还涉及几个线程对象.比如JavaThread, OSThread

包括你看到的JDK层面的Thread的线程状态,和JVM中的线程状态,以及内核的线程状态,都是不完全一样的.

以上也只是分析了一个普通的线程退出之后,内核线程也自然退出了.

难道main线程也是这样的吗? main线程是第一个线程吗?

我们后面再单独说下main线程的情况.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Netty历险记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java线程生命周期与状态切换
最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。
Throwable
2020/06/23
8730
线程的实现与分析
线程是操作系统调度的最小单位,实现线程有三种方式,而 Java Thread 采用的是 内核线程实现
itliusir
2020/01/15
3460
Java并发编程基础篇(一)之线程
Java并发编程基础篇(一)之线程
Java架构师必看
2021/04/13
5160
Java并发编程基础篇(一)之线程
内核线程的创建和运行
通过 ps 命令可以看到红色方框标出的都是父进程为2号进程的内核线程,2号进程即蓝色方框标出的进程 kthreadd,1号进程是绿色方框标出的进程 init,它们的父进程号都是0。
刘盼
2021/07/05
1.8K2
内核线程的创建和运行
本文深入探讨虚拟机运行时的java线程启动、停止、睡眠与中断
上节描述了虚拟机中各式各样的线程及其创建过程,其中尤为重要的是JavaThread,它是Java线程java.lang.Thread在JVM层的表示,包含很多重要数据。
愿天堂没有BUG
2022/10/31
5470
本文深入探讨虚拟机运行时的java线程启动、停止、睡眠与中断
java中守护线程与用户线程
Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程是一个用户线程,这个是我们可以看到的线程,其实JVM内部同时还启动了好多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别那?区别之一是当最后一个非守护线程结束时候,JVM会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的退出。言外之意是只要有一个用户线程还没结束正常情况下JVM就不会退出。
加多
2018/09/06
1.3K0
java中守护线程与用户线程
java中断机制深入分析之Thread源码跟踪
在jdk1.0时代,要终止一个Java线程,可以使用Thread提供的stop()和destroy()等方法,但这些方法在jdk1.4之后就已经不推荐使用了,原因是这些方法会强行关闭当前线程,并解锁当前线程已经持有的所有监视器(互斥锁、共享锁),这会导致被这些监视器保护的数据对象处于不一致的状态,其它线程可以查看到这些不一致状态的数据对象,从而导致各种不可预知的错误。
saintyyu
2021/11/22
8120
java中断机制深入分析之Thread源码跟踪
Java线程调度&状态
线程的执行时间由线程本身控制,线程在工作完成以后要主动通知系统切换到另一个线程上。优点是实现简单、切换操作对线程自己可见,不存在线程同步问题;缺点是线程时间不可控制,有可能造成程序一直阻塞。
shysh95
2021/04/02
5980
Java多线程编程
一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 “同时” 执行 着多份代码
用户9645905
2023/10/23
2510
Java多线程编程
Java线程的那些状态
Java线程(或者说计算机线程),是有一些状态来表示当前线程运行信息的,可以通过jsatck命令来查看Java进程中线程函数栈信息,其中就包括了Java线程状态。
luoxn28
2021/04/08
3710
Java多线程与并发
进程是资源分配的基本单位,所有与进程有关的资源都记录在进程控制块PCB中,以表示进程拥有这些资源或者正在使用它们,进程也是抢占处理机的调度单位,它拥有完整的虚拟内存地址空间,当进程发生调度时,不同的进程拥有不同的地址空间,而同一进程内的不同线程共享同一地址空间。与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其它线程共享进程的资源。
ha_lydms
2023/08/10
2280
Java多线程与并发
Java线程创建过程中的各种细节
哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。
子牙老师
2022/05/16
7940
Java线程创建过程中的各种细节
linux内核线程「建议收藏」
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangweiqing80/article/details/83088465
全栈程序员站长
2022/09/15
1.6K0
主线程异常会导致 JVM 退出?
上周线程崩溃为什么不会导致 JVM 崩溃在其他平台发出后,有一位小伙伴留言说有个地方不严谨
kunge
2022/09/02
1.4K0
主线程异常会导致 JVM 退出?
相关推荐
Java线程生命周期与状态切换
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验