首页 > 编程语言 >Java基础知识29--主线程、子线程执行顺序

Java基础知识29--主线程、子线程执行顺序

时间:2023-10-05 11:33:22浏览次数:39  
标签:Java Thread -- 主线 29 System 线程 println out

1、主线程与子线程互不影响

最常见的情况,主线程中开启了一个子线程,开启之后,主线程与子线程互不影响各自的生命周期,即主线程结束,子线程还可以继续执行;子线程结束,主线程也能继续执行。

public class TestThread{
public static void main(String[] args) throws InterruptedException {
    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、主线程开启了子线程,但是主线程结束,子线程也随之结束;

代码如下:

public class TestThread{
    public static void main(String[] args) throws InterruptedException {
        System.out.println("主线程启动。。。。");
        Thread thread = new Thread(new ChildThread());
        //thread.setDaemon(true);
        thread.start();
        System.out.println("主线程结束。。。。");
    }
}
class ChildThread implements Runnable{
    @Override
    public void run() {
        try {
            System.out.println("子线程启动。。。。");
            ThirdThread thiredThread = new ThirdThread();
            thiredThread.setDaemon(true);
            thiredThread.start();
            Thread.sleep(1000);
            System.out.println("子线程结束。。。。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class ThirdThread extends Thread{
    @Override
    public void run() {
        System.out.println("孙子线程启动。。。。");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("孙子线程结束。。。。");
    }
}

执行结果:

运行结果如下:

主线程启动。。。。
主线程结束。。。。
子线程启动。。。。
孙子线程启动。。。。
子线程结束。。。。

为什么主线程结束,子线程也结束了呢?

原来这里使用了Thread.setDaemon(true)方法把线程ThirdThread 设置成了线程ChildThread的守护线程,所以ChildThread线程一结束,ThirdThread 线程也就随之结束。对于运行中的线程,不能设置为守护线程,不然会抛出java.lang.IllegalThreadStateException异常。

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

测试代码:

public class TestThread{
   public static void main(String[] args) throws InterruptedException {
      System.out.println("主线程启动。。。。");
      Thread thread = new Thread(new ChildThread());
      thread.start();
      thread.join();
      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();
        }
    }
}

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

执行结果:

主线程启动。。。。
子线程启动。。。。
子线程结束。。。。
主线程结束。。。。

总结:
进程是资源分配的基本单位,线程是cpu调度的基本单位。对于cpu来说,其实不存在主线程和子线程之分,都是一个线程。进程的资源是进程下面的线程所共享的,只要进程还在,线程就可以正常执行,也就是说线程是依赖于进程的,线程与线程之间并不存在依赖关系,一个线程的死亡理论上不会对其他线程造成影响。但是上面通过调用JVM提供的接口,例如setDaemon与join改变了主线程与子线程的关系,这些应该是JVM接口代码做了处理干扰了线程的生命周期。
守护线程与非守护线程本质上没什么区别,但是如果虚拟机中存活的线程都是守护线程的时候,虚拟机就会退出,只要虚拟机中还有一个非守护线程,虚拟机就不会退出。

标签:Java,Thread,--,主线,29,System,线程,println,out
From: https://www.cnblogs.com/luckyplj/p/17743186.html

相关文章

  • delphi中FormDestroy和FormClose的区别和联系
    在Delphi中,FormDestroy和FormClose是用于处理窗体关闭事件的两个不同的事件处理程序。它们有一些区别和联系,下面我将详细解释它们之间的差异和关联:FormDestroy事件:FormDestroy事件是一个在窗体销毁时触发的事件。这个事件通常用于释放在窗体生命周期内创建的资源,如对象、......
  • Axure RP「axure交互式原型设计软件」下载 安装包下载方式
    AxureRPPro是一款业界领先的原型设计软件,可以帮助用户快速制作高交互性的网站和应用程序原型。AxureRPPro除了基本的线框图和原型设计外,还提供了互动元素库、组件库、行为模拟器等多种工具,可大幅提高设计速度和准确度。软件地址:看置顶贴AxureRP8.0软件介绍AxureRP8.0中文版......
  • Electrical CAD安装包 电气工程-Electrical CAD安装包下载
    AutoCADElectrical是一款功能强大、专业的电气设计软件。它具有电气符号库和符号自动编号、电气原理图设计、电线和电缆管理、PLC和控制系统集成、即时错误检查和报告、实时协作与协同设计、自动生成图表和表格、自定义和可扩展性等特点。通过使用AutoCADElectrical,电气工程师可......
  • AutoCAD Electrical 2020 64位简体中文安装版下载 安装包下载
    AutoCADElectrical2013基于在AutoCAD2013打造,Electrical版本也叫AutoCAD电气版,在AutoCAD的基础上添加了一个Electrical模块,内置简体中文,增加了多种工具和一整套电气设计CAD功能,如符号库、物料清单(BOM)报告和PLCI/O设计等等,增强了界面视觉效果,专业的电器设计工具可极大的提高了......
  • 「Artlantis下载」Artlantis渲染器2020版 安装包下载方式
    Artlantis2020官方版是一款三维渲染软件,Artlantis2020官方版主要用于建筑绘图场景的三维渲染,对于建筑设计师来说,这款软件可以帮助极大提高渲染效率。软件可与市场上的所有3D建模软件兼容,是创建逼真的渲染和动画的最简单,最快的解决方案。自带渲染引擎,用户无需借助其他软件,专家和初......
  • 最长匹配原则
    目的地址与路由条目一一比对,实现最精确的匹配实例1:实例2:......
  • 【分享】office 2007、2010、2013最终版分享 (转)
    转自宋永志博客,宋永志博客-最纯净的系统下载站(songyongzhi.com)Office2007SP3简体中文专业增强版2019.02(终结版)软件介绍:1、Office2007SP3专业增强版,集成补丁至2019年02月,集成正版序列号,安装完后自动激活。2、Office2007只有32位版本,可以兼容64位系统,请放心使用。3、......
  • 实验1
    实验1源代码1//打印一个字符小人23#include<stdio.h>4intmain()5{6printf("o\n");7printf("<H>\n");8printf("II\n");9printf("o\n");10printf("<H>\n&q......
  • 10.5算法
    对称二叉树给你一个二叉树的根节点root,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false 提示:树中节点数目在范围[1,1000]内-100<=Node.val<=100 /** * Definition for a binary tree......
  • VC++编写ActiveX控件方法
    暑假在做一个项目的时候,本来是用C#.NET来写的一个港口进出闸的流程控制程序,里面涉及一个响应用PLC的采集信息的问题(PLC用串口和工控机相连接),然后思考如何用C#写串口通讯程序,结果师兄在一旁直接用VC++写了一个“*.ocx控件”,并在自己的电脑上进行了测试,完工后就把生成的“*.ocx”控......