Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

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

线程的创建
线程的基本操作
Java线程实现
线程是什么
ThreadLocal
Thread.onSpinWait()
线程等待
守护线程(Daemon Thread)
终止(TERMINATED)
计时等待(TIMED_WAIT)
等待(WAITING)
阻塞(BLOCKED)
就绪(RUNNABLE)
新建(NEW)
一课一练
线程基础
线程API使用
线程状态转移
线程生命周期
线程

该思维导图由 AI 生成,仅供参考

今天我们来深入聊聊线程,相信大家对于线程这个概念都不陌生,它是 Java 并发的基础元素,理解、操纵、诊断线程是 Java 工程师的必修课,但是你真的掌握线程了吗?
今天我要问你的问题是,一个线程两次调用 start() 方法会出现什么情况?谈谈线程的生命周期和状态转移。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Java线程的基本概念、生命周期和状态转移,以及线程编程中的常见陷阱和建议。文章指出了线程启动两次会抛出异常的情况,以及线程的不同状态,对于理解和掌握线程编程至关重要。此外,文章还提到了线程编程可能涉及的面试考点,以及线程API的使用建议,如守护线程、线程等待条件、Thread.onSpinWait()等。文章还介绍了ThreadLocal的使用和注意事项,以及提出了一个有趣的问题,引发读者思考。总的来说,本文为读者提供了一个全面了解线程基础知识和面试考点的入门指南。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(55)

  • 最新
  • 精选
  • 风动静泉
    一课一练: 使用了两种方式获取当前程序的线程数。 1、使用线程管理器MXBean 2、直接通过线程组的activeCount 第二种需要注意不断向上找父线程组,否则只能获取当前线程组,结果是1 结论: 使用以上两种方式获取的线程总数都是5个。 main Attach Listener Signal Dispatcher Finalizer Reference Handler 此外,如果使用的IDE是IDEA 直接运行会多一个Monitor Ctrl-break线程,这个是IDE的原因。debug模式下不会有这个线程。

    作者回复: 不错

    2018-06-14
    6
    119
  • 小文同学
    做了一个test分析老师的问题,观察到的情况如下: JVM 启动 Hello World的线程分析 环境: macOS + jdk8 检测获得 Thread[Reference Handler,10,system] Thread[Finalizer,8,system] Thread[main,5,main] Thread[Signal Dispatcher,9,system] Hello World! 其中: Reference Handler:处理引用对象本身的垃圾回收 Finalizer:处理用户的Finalizer方法 Signal Dispatcher:外部jvm命令的转发器 在jdk6环境中 还有一个Attach Listener的线程 是负责接收外部命令的,如jmap、jstack

    作者回复: 不错

    2018-06-14
    5
    85
  • 爱折腾的老斑鸠
    theadlocal里面的值如果是线程池的线程里面设置的,当任务完成,线程归还线程池时,这个threadlocal里面的值是不是不会被回收?

    作者回复: 嗯,线程池一般不建议和thread local配合...

    2018-06-14
    2
    24
  • 行者
    “我们会发现一个特别的地方,通常幻象引用都会和引用队列配合清理机制使用,但是 ThreadLocal 是个例外,它并没有这么做。” 老师,Entry继承的是WeakReference,这个是弱引用吧。 main: System.out.println("hello world"); ThreadGroup group = Thread.currentThread().getThreadGroup(); ThreadGroup topGroup = group; while (group != null) { topGroup = group; group = group.getParent(); } int nowThreads = topGroup.activeCount(); Thread[] lstThreads = new Thread[nowThreads]; topGroup.enumerate(lstThreads); for (int i = 0; i < nowThreads; i++) { System.out.println("线程number:" + i + " = " + lstThreads[i].getName()); } out: 线程number:0 = Reference Handler // 计算对象是否可达? 线程number:1 = Finalizer // 回收对象时触发的finalize方法? 线程number:2 = Signal Dispatcher // 线程调度员 线程number:3 = main 线程number:4 = Monitor Ctrl-Break // 监控器,锁相关

    作者回复: 前面是翻译窜了,已经修正;后面大家用了很多方法,基本都可以,主要目的是结合前面的介绍加深理解

    2018-06-14
    2
    22
  • tyson
    1、站在应用程序方面,只创建了一个线程。 2、站在jvm方面,肯定还有gc等其余线程。 总结: 1、线程是系统调度的最小单元,应该是进程吧。线程是操作系统的资源,在运行的时候会打开文件描述符等。 2、 resume、stop、suspend等已经被废弃了 3、线程的等待和唤醒,建议使用reentrantlock的condition wait/notify方法 4、可以使用线程的join方法、countdownlatch、cyclicbarrier、future等进行线程的等待

    作者回复: 不错

    2018-06-14
    12
  • 李二木
    现在觉得踩坑是一种很好学习方法

    作者回复: 同意

    2018-06-15
    9
  • 扬~
    等待与阻塞有什么区别呢

    作者回复: 范范谈有点晦涩,可以从线程进入、退出blocked/waiting的方法/条件来对比

    2018-11-24
    3
    5
  • TonyEasy
    老师,我有一点疑问,在线程池里复用线程时是不是对同一个线程调用了多次.start()方法呢?

    作者回复: 不是的,工作线程一般不退出的,复用的是类似runnable这种

    2018-06-18
    5
  • mongo
    杨老师请教你,关于高并发和线程池,我刚刚入门,工作中没有涉及过这一块。我阅读了oracle java tutorial high level concurrency 章节,阅读并粗略理解了《并发编程实践》这本书,想进一步清晰我的理解,我现在苦于在实践练习方面不知道怎么进行。老师有什么具体可行的思路指点一下吗?留言圈里有好多大神,在这里同时也请教其他的朋友。谢谢老师,谢谢大家。

    作者回复: 下面章节就会覆盖这部分,我谈下自己的思路:大部分工程师是没有机会在工作中,全面使用并发的那些东西的,尤其是反馈读者中初学者不少;所以,我建议有个整体性体系有个了解,分清大体都有什么;然后可以选些实践场景,去实现用例代码。面试中大体也就够了,毕竟项目经验不是教程能解决的

    2018-06-15
    5
  • 通常弱引用都会和引用队列配合清理机制使用,但是 ThreadLocal 是个例外,它并没有这么做。 这意味着,废弃项目的回收依赖于显式地触发,否则就要等待线程结束,进而回收相应 ThreadLocalMap!这就是很多 OOM 的来源 这个平时还真没注意

    作者回复: 嗯,为了生命周期的需求

    2018-06-14
    5
收起评论
显示
设置
留言
55
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部