文章目录

  • 一、线程的六种状态
  • 二、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()方法解析相关推荐

  1. Java 中Thread的sleep、join、yield方法解析

    1.Thread中sleep方法作用是使当前线程等待,其他线程开始执行,如果有线程锁,sleep不会让出锁 没有加锁代码如下: public class SynchronizedSleepMethod ...

  2. 面试官系统精讲Java源码及大厂真题 - 27 Thread 源码解析

    27 Thread 源码解析 书籍乃世人积累智慧之长明灯. 引导语 从本章开始我们开始学习线程的知识,线程是非常有趣的一个章节,大多数同学对于线程 API,属于不用就忘,到用时需要百度的情况,希望通过 ...

  3. Java Thread 源码解析

    Thread 源码解析 线程的方法大部分都是使用Native使用,不允许应用层修改,是CPU调度的最基本单元.线程的资源开销相对于进程的开销是相对较少的,所以我们一般创建线程执行,而不是进程执行. T ...

  4. python中reversed是什么意思_Python reversed函数及使用方法解析

    Python reversed函数及使用方法解析 有些时候,程序需要进行反向遍历,此时可通过 reversed() 函数,该函数可接收各种序列(元组.列表.区间等)参数,然后返回一个"反序排 ...

  5. 【java并发】AQS中acquire方法解析

    AQS,全名AbstractQueuedSynchronizer(抽象队列同步器),它是CLH(不明白的可以先了解一下CLH)的变种.它与CLH不同之处在于:        CLH是一种公平锁,它是通 ...

  6. spring getBean()方法解析概述

    1.getBean(beanName) 整体概述 1.transformedBeanName(name) name可能是别名,将别名(alias)解析成真正的beanName 截取&beanN ...

  7. 从一道面试题分析Thread.interrupt方法

    阿里面试题: public class TestThread {public static void main(String[] args) {Thread t1 = new Thread() {@O ...

  8. Peer J:整合高通量绝对丰度定量方法解析土壤细菌群落及动态

    本文转自"上海天昊生物",已获授权 英文题目: Assessing soil bacterial community and dynamics by integrated high ...

  9. leaq c 汇编语言,汇编语言lea指令使用方法解析

    这篇文章主要介绍了汇编语言lea指令使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 lea指令变种(按大小分类): leaw #2个字节 ...

最新文章

  1. Platform Builder 5下WinCE 5.0目录结构
  2. 4月全球操作系统市场份额:Win 7份额连续4月上涨
  3. (0036) iOS 开发之HTTPS、SSL验证
  4. (转)angular进行md5加密 base64加密 哈希加密
  5. GloVe:Global Vectors for Word Representation
  6. canopy算法 java_mahout源码canopy算法分析之二CanopyMapper
  7. 简单说下C#变量的作用域
  8. 网络监视工具nethogs命令
  9. json接口文档模板_在.Net Core WebAPI下给Swagger增加导出离线文档功能
  10. 基金投资顾问制度即将启动,巨头入局
  11. Multisim应用举例
  12. redhat7安装Oracle11g数据库全过程
  13. 计算机日常故障及维修,电脑常见问题和故障处理
  14. 软考顺口溜汇总(包括监理活动“四控、三管、一协调”等)
  15. numpy中的array函数
  16. 人工智能AI对客户服务的影响正在形成
  17. 基于插值算法和Gardner定时误差检测的OOK信号定时同步的FPGA实现
  18. 我为账户和推广计划指定了不同的推广地域,以哪一个为准?
  19. 服务器和桌面操作系统有什么区别,服务器和桌面操作系统的区别
  20. 用python玩微信(聊天机器人,好友信息统计)

热门文章

  1. 开发一个数字华容道的小游戏
  2. 哪些公认的健康食品其实并非那么健康?为什么?
  3. 单片机开发板的c语言设计,求助大神,c语言没学好,单片机课程设计根本做不到啊...
  4. 不到3岁宝宝说“我要杀了你”(转)
  5. BiliBili直播 弹幕信息抓取
  6. libvirt domin的生命周期控制
  7. 全国地区城市行政代码字典表(带城市天气代码)
  8. 【SEO】域名前缀www与不加的对比性质
  9. 技术学派:使用JS transform属性,实现旋转木马效果
  10. win10怎样查看电脑有哪些硬件配置?