码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java并发 | 08.[方法] 线程的生命周期及常用的方法


    文章目录

    • 1. 线程的生命周期
    • 2. 常用的方法
      • 2.1. t1.start( ) - 启动线程
      • 2.2. Thread.sleep( long m ) - 谁调用谁休眠
      • 2.3. t1.join( ) - 调用者等待t1线程执行完毕
      • 2.4. t1.interruped( ) - 打断
      • 2.6. 错误示范:若直接调用了线程的run( )
    • 参考资料

    1. 线程的生命周期

    Java线程在生命周期中的某一时刻可能处于一下6种状态的其中一种:

    • [初始状态 - New] 线程被创建出来但并未调用 start( );
    • [运行状态 - Runnable] 线程被调用了 start( ) 后处于就绪或运行状态;
    • [阻塞状态 - Blocked] 阻塞状态,正在等待锁被释放;
    • [等待状态 - Waiting] 该线程需要等待其他线程作出一些特定动作(通知或中断);
    • [超时等待状态 - Time Waiting] 线程在等待指定的时间后会继续执行,目前正处于等待状态;
    • [终止状态 - Terminated] 线程执行完毕。

    值得一提的是,在操作系统中有Ready和Running状态,但在JVM中将这两种状态合并成了「Runnable」状态。

    Java 线程状态变迁图

    2. 常用的方法

    方法签名功能描述备注
    static Thread Thread.currentThread()获取本线程的Thread对象静态方法
    void Thread.start()启动线程并执行线程内的run方法
    void Thread.run()执行线程的run方法若在start()之前就调用了run(),并不会启动新线程
    而是在当前线程(eg:主线程)直接执行内部的run()
    static void Thread.sleep(long m)使线程「休眠」一定时间(单位:ms)静态方法,谁调用谁休眠
    Runnable -> Time Waiting
    void Thread.yield()使线程「让出」CPU
    void Thread.join()使调用的线程「等待」该线程执行完毕通常是在主线程中调用子线程的join(),即主线程「同步等待」子线程
    Runnable -> Time Waiting
    void Thread.wait()
    void Thread.setPriority(int p)设置线程优先级默认5,可设置的范围是1-10,优先级越高的线程抢到时间片的概率越大
    void Thread.interrupt()打断线程① 若被打断的线程正处于Time Waiting,则会停止并抛出异常,且将打断标记重置为false;
    ② 处于Runnable状态的线程不会停止,而仅仅是将打断标记设置为true
    boolean Thread.isInterrupt();获取打断标记

    2.1. t1.start( ) - 启动线程

    // 创建线程
    Thread t1 = new Thread(() -> {
       // code here... 
    }, "t1");
    
    // 启动线程
    t1.start();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image-20220830015851216

    2.2. Thread.sleep( long m ) - 谁调用谁休眠

    Thread.sleep(1000);		// 休眠1s
    
    • 1

    image-20220830022042762

    2.3. t1.join( ) - 调用者等待t1线程执行完毕

    Thread t1 = new Thread(() -> {
        // code here...
    }, "t1");
    
    t1.start();
    
    // 当前线程等待t1执行完毕
    t1.join();
    // code here...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image-20220830020707376

    2.4. t1.interruped( ) - 打断

    • 若线程处于 Time Waiting 状态,则会抛出异常并停止执行,且将打断标记重置为false;
    • 若线程处于 Runnable 状态,不会停止执行,而仅仅只是将打断标记设置为true。

    image-20220830024538854

    image-20220830024657825

    2.6. 错误示范:若直接调用了线程的run( )

    t1.run()			// 不会开启新的线程,而是在当前线程中执行run()
    
    • 1

    image-20220830025003156

    参考资料

    [文章] javaGuide - Java并发常见面试题总结(上)

  • 相关阅读:
    学习MyBatis时遇到的细节问题
    Nlog详解---非常详细
    解决在服务器中减少删除大文件夹耗时太久的问题
    【网络是怎么连接的】第四章 探索接入网和网络运营商
    【YOLO系列】YOLOv1学习(PyTorch)原理加代码
    KDZD绝缘油介质损耗电阻率测试仪特点
    盘点73个Python各行各业管理系统源码Python爱好者不容错过
    【leetcode】239. 滑动窗口最大值
    使用guacamole进行WEB远程桌面连接
    数据库之MHA
  • 原文地址:https://blog.csdn.net/xyxyxyxyxyxyx/article/details/126595721
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号