首页 > 编程语言 >Java中线程的生命周期

Java中线程的生命周期

时间:2023-12-21 23:35:15浏览次数:30  
标签:生命周期 Java Thread thread Object state waiting 线程 中线

大家好,我是joker,希望你快乐。

首先说一道常见的面试题,一个线程能不能两次调用start()方法,会有什么效果?

正如大家知道的,答案:不能,线程启动后不能再次启动,会报运行时异常,IllegalThreadStateException

线程是什么?

从操作系统的角度,可以简单的认为,线程是系统调度的最小单元,一个进程可以包含多个线程,作为任务的真正运作者,有自己的栈(stack),寄存器(register),本地存储(thread local)等,但是会和进程内其他线程共享文件描述符,虚拟地址空间。

线程分内核线程,用户线程,Java的线程实现是和虚拟机相关的。Hotspot线程模型是一对一映射到操作系统的内核线程。

守护线程(Deamon Thread):后台线程,不希望其影响应用退出,如果JVM发现只有守护线程,将结束进程。

JDK5以后Java Thread Stack默认为1M

线程各状态说明

接下来线程启动后都有哪些状态?这些状态如何相互转换?

线程生命周期不同状态:可以在java.lang.Thread.State枚举中看到

public enum State {
    /**
        * Thread state for a thread which has not yet started.
        */
    NEW,

    /**
        * Thread state for a runnable thread.  A thread in the runnable
        * state is executing in the Java virtual machine but it may
        * be waiting for other resources from the operating system
        * such as processor.
        */
    RUNNABLE,

    /**
        * Thread state for a thread blocked waiting for a monitor lock.
        * A thread in the blocked state is waiting for a monitor lock
        * to enter a synchronized block/method or
        * reenter a synchronized block/method after calling
        * {@link Object#wait() Object.wait}.
        */
    BLOCKED,

    /**
        * Thread state for a waiting thread.
        * A thread is in the waiting state due to calling one of the
        * following methods:
        * <ul>
        *   <li>{@link Object#wait() Object.wait} with no timeout</li>
        *   <li>{@link #join() Thread.join} with no timeout</li>
        *   <li>{@link LockSupport#park() LockSupport.park}</li>
        * </ul>
        *
        * <p>A thread in the waiting state is waiting for another thread to
        * perform a particular action.
        *
        * For example, a thread that has called <tt>Object.wait()</tt>
        * on an object is waiting for another thread to call
        * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
        * that object. A thread that has called <tt>Thread.join()</tt>
        * is waiting for a specified thread to terminate.
        */
    WAITING,

    /**
        * Thread state for a waiting thread with a specified waiting time.
        * A thread is in the timed waiting state due to calling one of
        * the following methods with a specified positive waiting time:
        * <ul>
        *   <li>{@link #sleep Thread.sleep}</li>
        *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
        *   <li>{@link #join(long) Thread.join} with timeout</li>
        *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
        *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
        * </ul>
        */
    TIMED_WAITING,

    /**
        * Thread state for a terminated thread.
        * The thread has completed execution.
        */
    TERMINATED;
}

新建(NEW):线程被创建但是还没有启动

就绪(RUNNABLE):线程已经在JVM中执行,可能正在运行,也可能正在就绪队列中等待系统分配CPU时间片

阻塞(BLOCKED):同步相关,表示线程正在等待Monitor Lock

等待(WAITING):正在等待其他线程采取某些操作

计时等待(TIMED_WAIT):进入条件和等待状态类似,但是调用的是存在超时条件的方法

终止(TERMINATED):线程终止运行,不管是正常执行结束还是意外退出

各个状态之间的转化:

查看JVM运行线程的方式

通过线程组,一直找到最顶级的父线程组

通过jstack

通过MXBean

标签:生命周期,Java,Thread,thread,Object,state,waiting,线程,中线
From: https://www.cnblogs.com/Crazy_Joker/p/17918394.html

相关文章

  • Linux下安装Java环境三种方式(tar.gz、rpm、yum)
    一、Java软件包下载Java各版本下载地址;进入页面后我们首先看到的是Java最新版本的下载界面,但是在这我需要下载Java8的版本,所以得划到下面的界面,即界面如下:在这里我将下载:jdk-8u381-linux-x64.tar.gz(压缩包方式安装)、jdk-8u381-linux-x64.rpm(RPM方式安装)注:在下载界面的下面一......
  • Java集合面试题
    我分析了上百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!小伙伴们可以对照着网站里面的文章学习或者准备面试。网站的内容会继续完善,欢迎你在评论区说出你遇到的高频面试题!林老师带你学编程(「Java学习+面试指南」是一份涵盖大部分Java程序员所需要掌握的核心知识......
  • Java 异常面试题
    我分析了上百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!小伙伴们可以对照着网站里面的文章学习或者准备面试。网站的内容会继续完善,欢迎你在评论区说出你遇到的高频面试题!林老师带你学编程(「Java学习+面试指南」是一份涵盖大部分Java程序员所需要掌握的核心知识......
  • Java多线程面试题
    我分析了上百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!小伙伴们可以对照着网站里面的文章学习或者准备面试。网站的内容会继续完善,欢迎你在评论区说出你遇到的高频面试题!林老师带你学编程(「Java学习+面试指南」是一份涵盖大部分Java程序员所需要掌握的核心知识......
  • Java IO面试题
    我分析了上百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!小伙伴们可以对照着网站里面的文章学习或者准备面试。网站的内容会继续完善,欢迎你在评论区说出你遇到的高频面试题!林老师带你学编程(「Java学习+面试指南」是一份涵盖大部分Java程序员所需要掌握的核心知识......
  • Java JVM面试题
    我分析了上百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!小伙伴们可以对照着网站里面的文章学习或者准备面试。网站的内容会继续完善,欢迎你在评论区说出你遇到的高频面试题!林老师带你学编程(「Java学习+面试指南」是一份涵盖大部分Java程序员所需要掌握的核心知识......
  • Java基础面试题
    我分析了上百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!小伙伴们可以对照着网站里面的文章学习或者准备面试。网站的内容会继续完善,欢迎你在评论区说出你遇到的高频面试题!林老师带你学编程(「Java学习+面试指南」是一份涵盖大部分Java程序员所需要掌握的核心知识......
  • Java之stream流的详细解析一
     2.Stream流2.1体验Stream流【理解】案例需求按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集合原始方式示例代码publicclassMyStrea......
  • Java中的page集合的遍历(取值/赋值)
    Page<FwSjJbEntity>page1=newPage<>(page,pageSize);LambdaQueryWrapper<FwSjJbEntity>queryWrapper=newLambdaQueryWrapper<>();Page<FwSjJbEntity>jbEntityPage=newPage<FwSjJbEntity>();if(name==null||name.equals......
  • Java登陆第二十七天——多种方法Servlet映射、Content-Type
    正常的Servlet映射<!--1.servlet-name用于关联映射路径1.servlet-class告诉Tomcat要实例化Servlet类的全类名2.url-patternURL路径--><servlet><servlet-name>Test1</servlet-name><servlet-c......