【小家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可能会改变线程的生命周期)。

守护线程与非守护线程本质上没什么区别,但是如果虚拟机中存活的线程都是守护线程的时候,虚拟机就会退出,只要虚拟机中还有一个非守护线程,虚拟机就不会退出。



相关文章
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
110 0
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
269 83
|
3月前
|
存储 SQL 安全
Java 无锁方式实现高性能线程实战操作指南
本文深入探讨了现代高并发Java应用中单例模式的实现方式,分析了传统单例(如DCL)的局限性,并提出了多种无锁实现方案。包括基于ThreadLocal的延迟初始化、VarHandle原子操作、Record不可变对象、响应式编程(Reactor)以及CDI依赖注入等实现方式。每种方案均附有代码示例及适用场景,同时通过JMH性能测试对比各实现的优劣。最后,结合实际案例设计了一个高性能配置中心,展示了无锁单例在实际开发中的应用。总结中提出根据场景选择合适的实现方式,并遵循现代单例设计原则以优化性能和安全性。文中还提供了代码获取链接,便于读者实践与学习。
82 0
|
2月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
214 83
|
4月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
171 0
|
3月前
|
存储 Java
说一说 JAVA 内存模型与线程
我是小假 期待与你的下一次相遇 ~
|
3月前
|
移动开发 Java
说一说 Java 是如何实现线程间通信
我是小假 期待与你的下一次相遇 ~
|
3月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
186 5

热门文章

最新文章