相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


【小家java】Java中的线程池,你真的用对了吗?(教你用正确的姿势使用线程池)
小家Java】一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结
【小家java】BlockingQueue阻塞队列详解以及5大实现(ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue…)
【小家java】用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)


进程和线程(和协程)

通俗的讲, 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位(比如QQ是个进程、微信是个进程)

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。

  1. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
  2. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
  3. **协程是一种用户态的轻量级线程**,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

在Java中使用协程,一般会用到kilim( https://github.com/kilim/kilim )这个框架。因此本文不做讨论

主线程与子线程之间的关系

1、最常见的情况,主线程中开启了一个子线程,开启之后,主线程与子线程互不影响各自的生命周期,即主线程结束,子线程还可以继续执行;子线程结束,主线程也能继续执行。
/*** @author fangshixiang@vipkid.com.cn* @description* @date 2018-11-05 14:32*/
public class Main {public static void main(String[] args) {System.out.println("主线程启动。。。。");Thread thread = new Thread(new ChildThread());thread.start();System.out.println("主线程结束。。。。");}
}class ChildThread implements Runnable {@Overridepublic void run() {try {System.out.println("子线程启动。。。。");Thread.sleep(5000);System.out.println("子线程结束。。。。");} catch (InterruptedException e) {e.printStackTrace();}}}
输出:
主线程启动。。。。
主线程结束。。。。
子线程启动。。。。
子线程结束。。。。
2、主线程开启了子线程,但是主线程结束,子线程也随之结束
thiredThread.setDaemon(true);

只需要把子线程设置为守护线程即可

3、主线程开启了一个子线程,主线程必须要等子线程运行完之后,才能结束主线程
thread.join();

只需要把子线程自动后,join一下就行了

这里使用了join()方法,让主线程等待子线程结束,然后主线程继续执行。这里join()方法必须要在子线程启动之后,再调用。

通信

子线程与主线程的通信,一般在Android中使用,因此本文也不作为重点进行讨论

总结

进程是资源分配的基本单位,线程是cpu调度的基本单位。

但是上面通过调用JVM提供的接口,例如setDaemon与join改变了主线程与子线程的关系,这些应该是JVM接口代码做了处理干扰了线程的生命周期

对于cpu来说,其实不存在主线程和子线程之分,都是线程(JVM提供的API可能会改变线程的生命周期)。
守护线程与非守护线程本质上没什么区别,但是如果虚拟机中存活的线程都是守护线程的时候,虚拟机就会退出,只要虚拟机中还有一个非守护线程,虚拟机就不会退出。


关注A哥

Author A哥(YourBatman)
个人站点 www.yourbatman.cn
E-mail yourbatman@qq.com
微 信 fsx641385712
活跃平台
公众号 BAT的乌托邦(ID:BAT-utopia)
知识星球 BAT的乌托邦
每日文章推荐 每日文章推荐

【小家java】Java中主线程(父线程)与子线程的通信和联系相关推荐

  1. 面试官:如何让主线程等待所有的子线程执行结束之后再执行

    java 主线程等待所有子线程执行完毕在执行,在工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总(比如用户下单一个产品,后台会做一系列的处理,为了提高 ...

  2. OS / Linux / 主线程退出了,子线程会退出吗?

    在 linux 世界中,主线程退出了,子线程是否退出是要看主线程的退出方式. 主线程以 return 的方式退出. 主线程以 pthread_exit() 函数的方式退出. 前者,main() 执行完 ...

  3. 面试官:如何让主线程等待所有的子线程执行结束之后再执行?我懵了

    使用Thread的join方法 package com.qcy.testThreadFinish;/*** @author qcy* @create 2020/09/09 17:05:23*/ pub ...

  4. 主线程是如何向子线程传递数据的?_c++ 利用thread创建线程

    用进行多线程开发 小时候,老师总是教育我们上课要专心,"一心不可二用".可是CPU这个不听话的"熊孩子"偏偏却在一个芯片中加入了两个甚至多个运算核心,想要一&q ...

  5. Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)

    目录 QThread 官方解析 博主栗子 子线程发射信号给主线程 QThread 官方解析 Detailed Description QThread类提供了跨平台的线程管理的API. QThread对 ...

  6. Java多线程之----主线程会等待子线程结束再结束么,怎么让主线程等待子线程结束呐?

    首先给出结论: 主线程和子线程之间没有谁先谁后结束这种关联,它们只是各自负责自己的线程任务,如果该线程的任务结束了,该线程自然会结束运行. talk is cheap,show me the code ...

  7. c语言主线程退出子线程,简单了解C语言中主线程退出对子线程的影响

    这篇文章主要介绍了简单了解C语言中主线程退出对子线程的影响,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于程序来说,如果主进程在子进程还未结束时 ...

  8. QT中主线程终止子线程中的死循环

    终止子线程循环 一,原因 二,解决方法 一,原因 子线程中存在死循环,在主线程退出后,子线程还在继续运行,无法起到杀死线程的作用,造成后台存在多个相同功能进程,占用资源. 二,解决方法 发送SengM ...

  9. Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信)

    1.先熟悉handler方式实现主线程和子线程互相通信方式,子线程和子线程的通信方式 如果不熟悉或者忘记了,请参考我的这篇博客     Android之用Handler实现主线程和子线程互相通信以及子 ...

  10. 每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决...

    java程序在主线程中判断各个子线程状态的操作 每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是w ...

最新文章

  1. 华为机考HJ2计算字符个数
  2. 力扣- -去除重复字母
  3. Javascript - ExtJs - 组件 - 分页
  4. 近300万记录的论坛还用这个分页存储过程
  5. 吴恩达深度学习的实用层面编程作业:初始化Initialization
  6. element ui 选项卡切换_Vue.js + element-ui 扫盲(服务端对大前端的扫盲)
  7. qcustomplot 游标吸附_QCustomplot使用分享(九) 绘制图表-多功能游标
  8. 全新激光雕刻机切割机打标机写字机三轴步进电机运动控制板 控制板硬件软件全部是自己开发的
  9. linux时间转excel,linux时间戳转换【操作模式】
  10. 番茄todo服务器维护,番茄ToDo:克服“拖延症”必备高效神器!
  11. 通过云打码实现人人网模拟登陆(现在已经无法使用)
  12. java Web api接入讯飞aiui(1)
  13. Vulkan简介(2)
  14. ipad协议,接口稳定版
  15. Java算法学习13——最近公共祖先
  16. 在N1盒子进行Openwrt的内网穿透
  17. Tomcat-- 掌握汤姆猫,看这一篇文章就够了
  18. PHP中private、public、protected的区别详解
  19. Visual Studio SVN创建分支 合并分支 切换分支 vs 插件 visualsvn
  20. Hive3.x数仓开发

热门文章

  1. 计算机应用专业招聘试讲内容,广东文艺职业学院2018年第二批合同制人员招聘专业技能考核和试讲题目...
  2. 雾霾不散,课就不得不停?
  3. 网络重置后网络适配器丢失和网络适配器前面是黄色叹号怎么办?
  4. 哈工大CSAPP程序人生大作业
  5. 关于修复弹窗被360弹窗拦截器拦截的问题的解决案例的分享
  6. linux命令行was集群启停,was集群架构设计
  7. Laravel 事件监听
  8. 计算机组装与维护补考论文,计算机组装与维护课程教学论文
  9. 1.新建laravel项目
  10. python安装.egg文件_芳草地-小狍子的空间_百度空间