[核心技术36问]17.一个线程两次调用start()方法会出现什么情况?谈谈线程的生命周期和状态转移。

2023-05-16

 

 

17.一个线程两次调用start()方法会出现什么情况?谈谈线程的生命周期和状态转移。

    Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start()被认为是编程错误。

    关于线程生命周期的不同状态,在Java 5以后,线程状态被明确定义在java.lang.Thread.State中,分别是:

NEW:表示线程被创建出来还没真正启动的状态,可以认为是一个Java内部状态;

RUNNABLE:表示该线程已经在JVM中执行,当然执行由于执行需要计算资源,它可能是正在运行,也可能还在等待系统分配给它CPU片段,在就绪队列里面排队;

BLOCKED:这个状态和同步非常相关,阻塞表示线程在等待一个Monitor lock。比如,线程试图通过synchronized去获取某个锁,但是其他线程已经独占了,那么当前线程就会处于阻塞状态;

WAITING:表示正在等待其他线程采取某些操作。一个常见的场景是类似生产者消费者模式,发现任务条件尚未满足,就让当前消费者线程等待(wait),另外的生产者线程去准备生产数据,然后通过类似notify等动作,通知消费者线程可以继续工作了。

Thread.join()也会令线程进入等待状态。

TIMED_WAIT:其进入条件和等待状态类似,但是调用的是存在超时条件的方法,比如wait或join等方法的指定超时版本;

TERMINATED:不管是意外退出还是正常执行结束,线程已经完成使命,终止运行,也有人把这个状态叫做死亡。

    在第二次调用start方法的时候,线程可能处于终止或者其他状态(非NEW),但是不论如何,都是不可以再次启动的。

 

线程是什么?

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

    在具体实现过程中,线程还分为内核线程,用户线程。

    守护线程:有的时候应用中需要一个长期驻留的服务程序,但是不希望其影响应用退出,就可以将其设置为守护线程,如果JVM发现只有守护线程存在时,将结束进程。必须在线程启动之前设置!!

 

写一个简单的程序,运行这个应用,java至少会创建几个线程?

public class HelloWorld {
	public static void main(String[] args){
		System.out.println("hello world!");
		//int count=Thread.activeCount();
		ThreadGroup group=Thread.currentThread().getThreadGroup();
		ThreadGroup topGroup=group;
		while(group!=null){
			topGroup=group;
			group=group.getParent();
		}
		int nowThreads=topGroup.activeCount();
		Thread[] list=new Thread[nowThreads];
		topGroup.enumerate(list);
		for(int i=0;i<nowThreads;i++){
			System.out.println("线程number:"+i+"="+list[i].getName());
		}
	}

}

  输出:

hello world!
线程number:0=Reference Handler //计算对象是否可达
线程number:1=Finalizer  //回收对象时触发的finalize方法
线程number:2=Signal Dispatcher  //线程调度员
线程number:3=Attach Listener  //在java 6环境中有一个负责接收外部命令的,如jmap,jstack
线程number:4=main

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[核心技术36问]17.一个线程两次调用start()方法会出现什么情况?谈谈线程的生命周期和状态转移。 的相关文章

随机推荐

  • spring 事务不生效问题 bmw-jade-route事务配置

    在spring中配置了事务 xff0c 但是没有生效 64 Transactional rollbackFor 61 Exception class public Long insertTicket Ticket ticket List l
  • springboot 拦截器返回json字符串给前端页面

    在intercept中加入以下代码 xff1a private void returnJson HttpServletResponse response String json PrintWriter writer 61 null resp
  • 一句老话:学习贵在坚持,开始学习《Asp.net 程序设计》

    买Asp net书已经一年多了 xff0c 一年来总是为了工作忙忙碌碌 xff0c 书却没有好好看 最近终于可以有时间看书了 xff0c 翻了几页 xff0c 里面有我去年看书的笔记 xff0c 日期是2004 3 12日 看来已经是整整过
  • springboot注解拦截器不生效问题

    今天用springboot写了一个注解拦截器 xff0c 一直不生效 xff0c 网上各种方式我都尝试过了 xff0c 都不起作用 xff0c 找了好久总算知道是什么原因了 我的annotation xff1a 64 Inherited 6
  • springboot pom.xml 配置不替换问题

    今天遇到了一个问题 xff0c 在Pom中配置的变量在编译时没有自动替换 properties文件和 xml文件中的 key xff0c 后来发现原因是因为我在pom里面写了 xff1a 进入starter parent的pom以后发现 x
  • 项目启动报错:Caused by: java.lang.IncompatibleClassChangeError: Implementing class at java.lang.ClassLoad

    项目启动报错 xff1a Caused by java lang IncompatibleClassChangeError Implementing class at java lang ClassLoader defineClass1 N
  • resin服务本地调试

    在项目he project下建两个文件夹 xff0c 分别为resin和webapp 安装的resin放在resin文件夹中 xff0c resin文件夹如下 conf resin xml配置如下 xff1a lt Resin 4 0 co
  • 1机器学习基础—2统计学习方法概论

    一 机器学习基础 1 监督学习一般使用两种类型的目标变量 xff1a 标称型和数值型 在分类算法中目标变量的类型通常是标称型的 xff0c 而在回归算法中通常是连续性的 2 分类和回归都属于监督学习 分类是将实例数据划分到合适的分类中 xf
  • 2感知机

    1 感知机是二类分类的线性分类模型 xff0c 其输入为实例的特征向量 xff0c 输出为实例的类别 xff0c 取 43 1和 1二值 感知机对应于输入空间 xff08 特征空间 xff09 中将实例划分为正负两类的分离超平面 xff0c
  • [leetcode]大可日常打卡1

    344 Reverse String class Solution public String reverseString String s if s 61 61 null s length 61 61 0 return s StringB
  • [leetcode]大可日常打卡2

    804 Unique Morse Code Words 先把所有的字母以及对应的morse code存储到map里面 xff0c 然后对于words的每一个 xff0c 把对应的transformation存储到一个hashmap里面 xf
  • [2017校招]大可打卡1

    1 网易 合唱团 import java util Scanner public class Main public static void main String args Scanner sc 61 new Scanner System
  • [leetcode]大可日常打卡-树

    687 最长同值路径 一开始非常没有思路 看了解析以后 xff0c 找到了思路 xff0c 把长度看作是从一个节点向左右子树延伸出去的两个箭头 xff0c 从下往上遍历 xff0c 后序遍历递归 xff0c 如果箭头上的值等于节点的值 xf
  • 解决:Failed to download metadata for repo ‘base‘: Cannot download repomd.xml: Cannot download repodata

    1 先查看本机的系统信息 root 64 h0436 h0436 zlong cat etc redhat release 2 进入yum repos d root 64 h0436 zlong cd etc yum repos d 3 查
  • [剑指offer]大可日常打卡-树

    8 二叉树的下一个节点 给定一个二叉树和其中的一个结点 xff0c 请找出中序遍历顺序的下一个结点并且返回 注意 xff0c 树中的结点不仅包含左右子结点 xff0c 同时包含指向父结点的指针 思路 xff1a 中序遍历 xff0c 左根右
  • [核心技术36问]1-12

    1 谈谈你对Java平台的理解 xff1f Java是解释执行 xff0c 这句话正确吗 xff1f 典型回答 xff1a Java本身是一种面向对象的语言 xff0c 最显著的特性有两个方面 xff0c 一是所谓的 书写一次 xff0c
  • [计算机网络]一个完整的TCP连接

    当我们向服务器发送HTTP请求 xff0c 获取数据 修改信息时 xff0c 都要建立TCP连接 xff0c 包括三次握手 xff0c 四次挥手 什么是TCP连接 xff1f 为了实现可靠的数据传输 xff0c TCP要在应用进程之间建立传
  • [剑指offer]大可日常打卡-字符串

    5 替换空格 请实现一个函数 xff0c 将一个字符串中的每个空格替换成 20 例如 xff0c 当字符串为We Are Happy 则经过替换之后的字符串为We 20Are 20Happy public class Solution pu
  • [核心技术36问]13-24

    13 谈谈接口和抽象类有什么区别 xff1f 接口和抽象类都是java面向对象设计的两个基础机制 接口是对行为的抽象 xff0c 它是抽象方法的集合 xff0c 利用接口可以实现API定义和实现分离的目的 接口 xff0c 不能实例化 xf
  • [核心技术36问]17.一个线程两次调用start()方法会出现什么情况?谈谈线程的生命周期和状态转移。

    17 一个线程两次调用start 方法会出现什么情况 xff1f 谈谈线程的生命周期和状态转移 Java的线程是不允许启动两次的 xff0c 第二次调用必然会抛出IllegalThreadStateException xff0c 这是一种运