专栏首页BAT的乌托邦【小家java】Java中主线程(父线程)与子线程的通信和联系

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


进程和线程(和协程)

通俗的讲, 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位(比如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 {
    @Override
    public 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可能会改变线程的生命周期)。 守护线程与非守护线程本质上没什么区别,但是如果虚拟机中存活的线程都是守护线程的时候,虚拟机就会退出,只要虚拟机中还有一个非守护线程,虚拟机就不会退出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadLocal垮线程池传递数据解决方案:TransmittableThreadLocal【享学Java】

    在 上篇文章 了解到了,ThreadLocal它并不能解决线程安全问题,它旨在用于传递数据。但是它能成功传递数据比如有个大前提:放数据和取数据的操作必须是处于相...

    YourBatman
  • 【小家Java】自定义的线程池需要关闭吗?(局部变量Executors线程池一定要手动关闭)

    我之前看到很多同事写代码,为了提高效率,采用多线程去优化。由为了提高多线程的性能,用到了线程池。

    YourBatman
  • 【小家java】Java里的进程、线程、协程 、Thread、守护线程、join线程的总结

    说到线程,很多人最直观的感受就是多线程。本章不讨论高并发、多线程之类的。返璞归真,咱们来讨论讨论线程这个东西到底是什么东西,着眼于线程本身,我们怎么玩? 为了...

    YourBatman
  • Android多线程:你必须要了解的多线程基础知识汇总

    版权声明:本文为博主原创文章,未经博主允许不得转载,更多请继续关注Carson_Ho htt...

    Carson.Ho
  • 线程的生命周期

    线程的六种状态: NEW、RUNNABLE、BIOCKED、WAITING、TIME_WAITING、TERMINATED。

    用户7386338
  • 没想到,这么简单的线程池用法,深藏这么多坑!

    生产有个对账系统,每天需要从渠道端下载对账文件,然后开始日终对账。这个系统已经运行了很久,前两天突然收到短信预警,没有获取渠道端对账文件。

    andyxh
  • Java 线程池中的线程复用是如何实现的?

    那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worker 实现了 Runnabl...

    用户1516716
  • Java多线程:线程属性

    喜欢天文的pony站长
  • JUC线程池ThreadPoolExecutor源码分析

    很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章。之前在分析扩展线程池实现可...

    Throwable
  • ReentrantLock 源码解读

    | 傻瓜源码-内容简介 |

    傻瓜源码

扫码关注云+社区

领取腾讯云代金券