一个线程两次调用start()方法会出现什么情况?

Java线程不允许两次启动,第二次调用start()会抛出IllegalThreadStateException。线程有新建、就绪、运行、阻塞、等待、计时等待和终止七个状态。面试中,线程状态转换和并发编程知识常被考察。Java线程通过JNI调用本地代码实现,现代Java推荐使用Executor框架。守护线程、Spurious Wakeup和ThreadLocal的使用需要注意,理解线程状态有助于并发问题的解决。
摘要由CSDN通过智能技术生成

今天我们来聊一聊线程,提起线程大家肯定都不陌生,它是J ava并发的基础元素,理解、操纵、诊断线程也是Java工程师的一门必修课,但是你真的掌握线程了吗?
这里有一道经典的面试题:“一个线程两次调用start()方法会出现什么情况?谈谈线程的生命周期和状态转移。” 我们就以这道题目为切入点深入聊聊线程吧。
典型回答
Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误。
关于线程生命周期的不同状态,在Java 5以后,线程状态被明确定义在其公共内部枚举类型java.lang.Thread.State中,分别是:
新建(NEW),表示线程被创建出来还没真正启动的状态,可以认为它是个Java内部状态。
就绪(RUNNABLE),表示该线程已经在JVM中执行,当然由于执行需要计算资源,它可能是正在运行,也可能还在等待系统分配给它CPU片段,在就绪队列里面排队。
• 在其他一些分析中,会额外区分一种状态RUNNING,但是从Java API的角度,并不能表示出来。
阻塞(BLOCKED),这个状态和我们前面两讲介绍的同步非常相关,阻塞表示线程在等待Monitor lock。比如,线程试图通过synchronized去获取某个锁,但是其他线程已经独占了,那么当前线程就会处于阻塞状态。
等待(WAITING),表示正在等待其他线程采取某些操作。一个常见的场景是类似生产者消费者模式,发现任务条件尚未满足,就让当前消费者线程等待(wait),另外的生产者线程去准备任务数据,然后通过类似notify等动作,通知消费线程可以继续工作了。Thread.join()也会令线程进入等待状态。
计时等待(TIMED_WAIT),其进入条件和等待状态类似,但是调用的是存在超时条件的方法,比如wait或join等方法的指定超时版本,如下面示例:
public final native void wait(long timeout) throws InterruptedException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值