有的时候对于Java多线程,我们会听到“父线程、子线程”的概念。
严格的说,Java中不存在实质上的父子关系
没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程
子线程的消亡与父线程的消亡并没有任何关系,不会因为父线程的结束而导致子线程退出(操作系统中如此)。

父线程说法来源

父线程的说法应该是来自于Thread的构造对象时的初始化方法
再次看一下init方法,以下内容截取关键部分
可以看得出来,在init方法中,将创建这个线程的当前线程定义为“父”
        Thread parent = currentThread();
在初始化之后,线程组(如果没设置)、是否为守护线程、优先级、上下文类加载器、父线程ThreadLocal(稍后讲解)都是从当前线程获取的
除了一些初始值的设置来自于所谓“父线程”之外,并没有强关系
所以说,对Java中的线程,父线程的概念,只是一种逻辑称呼,创建线程的当前线程就是新线程的父线程,新线程的一些资源来自于这个父线程
在init方法中,对于所谓父线程的处理逻辑,换一个说法就是借助于当前正在运行的线程,对新创建线程进行一些必要的赋值与初始化

测试

下面的示例中,在主线程中创建了一个线程
线程中,循环三次打印当前线程名称,每次打印sleep 1秒
从结果可以看得出来,主线程结束后,子线程并没有结束,仍旧是继续运行,等到运行结束后,JVM退出
ps:上图黄色区域是编译器的提示,没什么事儿

结论

在Java中的确存在父线程、子线程的说法,代码中对这种说法也存在一定的逻辑体现
但是这种逻辑体现更多的是一种称谓,是一种人类认知层面上的,在程序这种“较真”的世界里面,所谓父线程只是创建新线程的当前线程
父线程的准确称呼应该被叫做当前线程的创建线程
当听到父线程的说法时,应该立即联想到的是创建线程,创建新线程时一些资源的供给者
一个线程与被他创建出来的线程,除了在创建的时候(init)会有一定的依赖交互之外,对JVM来说,他们并没有什么特别的依赖联系,两个独立的线程。

Java多线程父子线程关系 多线程中篇(六)的更多相关文章

  1. java基础24 线程、多线程及线程的生命周期(Thread)

    1.1.进程 正在执行的程序称作为一个进程.进程负责了内存空间的划分 疑问1:windows电脑称之为多任务的操作系统,那么Windows是同时运行多个应用程序呢? 从宏观的角度:windows确实在 ...

  2. Java进程和线程关系及区别

    1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基 ...

  3. ThreadLocal父子线程之间的数据传递问题

    一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取 ...

  4. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  5. Java线程和多线程(六)——守护线程

    当我们在Java中创建线程的时候,这个线程在默认的情况下是一个用户线程,并且,如果这个线程在运行,那么JVM就不会终结这个应用.和用户线程不同,当一个线程被标记为守护线程的时候,JVM在用户线程结束的 ...

  6. Java多线程编程(1)--Java中的线程

    一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...

  7. Java多线程与线程池技术

    一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...

  8. java多线程(一)——线程安全的单例模式

    概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3. ...

  9. Java多线程之线程的创建

    好久没有更博客了,最近一直在忙工作的事情.现在终于空下来了,这2天会抓紧时间整理多线程和socket,把JavaSE结束掉. 关于多线程,首先会涉及到哪些东西呢?首先要了解线程,为什么要使用线程,线程 ...

随机推荐

  1. VB6进行GZIP解压&C#进行GZIP压缩和解压

    VB进行GZIP解压的,DLL是系统的,如果没有 [点击下载] Option Explicit 'GZIP API '----------------------------------------- ...

  2. Java实现生产者与消费者模式

    生产者不断向队列中添加数据,消费者不断从队列中获取数据.如果队列满了,则生产者不能添加数据:如果队列为空,则消费者不能获取数据.借助实现了BlockingQueue接口的LinkedBlockingQ ...

  3. comutil

    使用该工具库,通常包含comsuppw.lib.kernel32.lib. _com_util::ConvertBSTRToString 将VT_BSTR类型转换为普通字符串.

  4. 在Centos中部署nginx

    准备工作: nginx的安装依赖openSSL,zlib和pcre Openssl下载地址: http://www.openssl.org/ zlib下载地址: http://www.zlib.net ...

  5. docker images

    docker images 介绍 镜像是动态的容器的静态表示,包括容器所要运行的应用代码以及运行时的配置.Docker镜像包括一个或者多个只读层(read-only layers),因此,镜像一旦被创 ...

  6. 20175324 2018-2019-2 《Java程序设计》第5周学习总结

    20175324 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 抽象类和具体类的区别在于抽象类中有抽象方法而具体类中没有.且抽象类不能实例化. 接口:如果一 ...

  7. RSA算法加解密

    package org.thcic.ejw.util.encrypt; import java.io.ByteArrayOutputStream; import java.security.Key; ...

  8. python绘制图

    如何用python绘制图表 摘要: 使用python绘制简单的图表,包括折线图.柱状图.条形图.饼图.散点图.气泡图.箱线图.直方图等. 前言 本文介绍如果使用python汇总常用的图表,与Excel ...

  9. FluentDataflow - Fluent Style TPL Dataflow

    我的新英文博客文章: FluentDataflow - Fluent Style TPL Dataflow 介绍了本人最新发布的一个开源类库:FluentDataflow--Fluent风格的TPL ...

  10. C 基于数组存储的堆栈实现

    一.堆栈简介 对于需要管理的队列,主要操作是在序列的末尾插入和取出(删除)元素,有这样操作要求的序列我们称之为堆栈(Stack). 堆栈可以认为是具有一定约束的线性表,插入和删除都作用在一个称为栈顶( ...