Thread.start()方法解析
文章目录
- 一、线程的六种状态
- 二、Thread.start()源码
- 三、问题:一个线程中的Thread.start()方法能多次执行吗?
一、线程的六种状态
线程的所有状态都在Thread中的State类中定义,如下所示:
public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
}
详情请见下图:
注意:从NEW状态出发后,线程不能回到NEW状态,同理,处于TERMINATED状态的线程也不能回到RUNNABLE状态。
二、Thread.start()源码
public synchronized void start() {//NEW状态的threadStatus=0,不为NEW状态抛出异常!if (threadStatus != 0)throw new IllegalThreadStateException();//添加到ThreadGroup中group.add(this);boolean started = false;try {start0();//设置started标记=truestarted = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}
}
start0()方法源码
private native void start0();
Thread.start()会调用本地方法start0()启动新线程并让这个线程执行run()方法。
run()方法源码
public void run() {if (target != null) {target.run();}
}
注意: 1.通过继承Thread类,重写run()方法创建新的线程,直接执行重写的run()方法。
2.实现Runnable接口,重写run()方法创建新的线程,通过Thread.run()方法调用重写的run()方法。
三、问题:一个线程中的Thread.start()方法能多次执行吗?
从上面的Thread.start()源码可以看出,当线程的状态不为NEW时,调用start()方法将抛出异常!线程从NEW状态出发,不能再回到NEW状态。因此,一个线程中的Thread.start()只能执行一次,不能多次执行。
Thread.start()方法解析相关推荐
- Java 中Thread的sleep、join、yield方法解析
1.Thread中sleep方法作用是使当前线程等待,其他线程开始执行,如果有线程锁,sleep不会让出锁 没有加锁代码如下: public class SynchronizedSleepMethod ...
- 面试官系统精讲Java源码及大厂真题 - 27 Thread 源码解析
27 Thread 源码解析 书籍乃世人积累智慧之长明灯. 引导语 从本章开始我们开始学习线程的知识,线程是非常有趣的一个章节,大多数同学对于线程 API,属于不用就忘,到用时需要百度的情况,希望通过 ...
- Java Thread 源码解析
Thread 源码解析 线程的方法大部分都是使用Native使用,不允许应用层修改,是CPU调度的最基本单元.线程的资源开销相对于进程的开销是相对较少的,所以我们一般创建线程执行,而不是进程执行. T ...
- python中reversed是什么意思_Python reversed函数及使用方法解析
Python reversed函数及使用方法解析 有些时候,程序需要进行反向遍历,此时可通过 reversed() 函数,该函数可接收各种序列(元组.列表.区间等)参数,然后返回一个"反序排 ...
- 【java并发】AQS中acquire方法解析
AQS,全名AbstractQueuedSynchronizer(抽象队列同步器),它是CLH(不明白的可以先了解一下CLH)的变种.它与CLH不同之处在于: CLH是一种公平锁,它是通 ...
- spring getBean()方法解析概述
1.getBean(beanName) 整体概述 1.transformedBeanName(name) name可能是别名,将别名(alias)解析成真正的beanName 截取&beanN ...
- 从一道面试题分析Thread.interrupt方法
阿里面试题: public class TestThread {public static void main(String[] args) {Thread t1 = new Thread() {@O ...
- Peer J:整合高通量绝对丰度定量方法解析土壤细菌群落及动态
本文转自"上海天昊生物",已获授权 英文题目: Assessing soil bacterial community and dynamics by integrated high ...
- leaq c 汇编语言,汇编语言lea指令使用方法解析
这篇文章主要介绍了汇编语言lea指令使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 lea指令变种(按大小分类): leaw #2个字节 ...
最新文章
- Platform Builder 5下WinCE 5.0目录结构
- 4月全球操作系统市场份额:Win 7份额连续4月上涨
- (0036) iOS 开发之HTTPS、SSL验证
- (转)angular进行md5加密 base64加密 哈希加密
- GloVe:Global Vectors for Word Representation
- canopy算法 java_mahout源码canopy算法分析之二CanopyMapper
- 简单说下C#变量的作用域
- 网络监视工具nethogs命令
- json接口文档模板_在.Net Core WebAPI下给Swagger增加导出离线文档功能
- 基金投资顾问制度即将启动,巨头入局
- Multisim应用举例
- redhat7安装Oracle11g数据库全过程
- 计算机日常故障及维修,电脑常见问题和故障处理
- 软考顺口溜汇总(包括监理活动“四控、三管、一协调”等)
- numpy中的array函数
- 人工智能AI对客户服务的影响正在形成
- 基于插值算法和Gardner定时误差检测的OOK信号定时同步的FPGA实现
- 我为账户和推广计划指定了不同的推广地域,以哪一个为准?
- 服务器和桌面操作系统有什么区别,服务器和桌面操作系统的区别
- 用python玩微信(聊天机器人,好友信息统计)