当前位置: 首页 > article >正文

【Java】多线程-thread类的常用方法和生命周期【主线学习笔记】

文章目录

  • 前言
  • 线程的常用结构
    • 线程中的构造器
    • 线程中的常用方法
    • 线程的优先级
  • 线程的生命周期
      • 线程状态转换图


前言

Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。


线程的常用结构

在 Java 中,线程是多线程编程的基本单位,它可以通过两种方式来创建:继承 Thread 类或实现 Runnable 接口。下面我们根据框架详细介绍线程的各个方面。

线程中的构造器

Thread 类提供了多种构造器来创建线程,最常用的有以下几种:

  1. Thread():创建一个没有指定目标的线程。线程创建后,必须重写 run() 方法,或者通过 start() 调用继承 Thread 的子类的 run() 方法。

    Thread thread = new Thread();
    
  2. Thread(Runnable target):接受一个实现了 Runnable 接口的对象,调用该对象的 run() 方法来执行线程任务。

    Runnable task = new MyRunnable();
    Thread thread = new Thread(task);
    
  3. Thread(String name):指定线程名称。

    Thread thread = new Thread("MyThread");
    
  4. Thread(Runnable target, String name):既指定了线程任务(Runnable 对象),又指定了线程名称。

    Runnable task = new MyRunnable();
    Thread thread = new Thread(task, "MyThread");
    

线程中的常用方法

Thread 类提供了许多控制线程的方法,以下是一些常用的线程操作方法:

  1. start():启动线程。调用该方法后,run() 方法会在线程中执行。

    thread.start();
    
  2. run():线程的执行体,必须重写 run() 方法以定义线程的任务。当线程启动后,run() 方法会自动被调用。

  3. current Thread():获取当前执行代码对应的线程。

  4. setName(String name):为线程设置一个名称。

    thread.current Thread().setName("NewThreadName");
    
  5. getName(String name):获取线程名称。

  6. sleep():让当前线程进入休眠状态指定的时间(以毫秒为单位)。sleep() 是静态方法,用于暂停线程的执行。

    try {
        Thread.sleep(1000);  // 休眠1秒
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    
  7. yield():静态方法,让当前执行的线程让出CPU资源,使其他同等优先级的线程可以执行。但这并不意味着当前线程会立刻停止。

    Thread.yield();
    
  8. join():等待其他线程完成执行。主线程可以调用某个子线程的 join() 方法,意味着主线程进入阻塞状态,主线程会等待该子线程执行完毕后才继续运行。

  9. interrupt():中断线程。如果线程处于等待或休眠状态,会抛出 InterruptedException 异常。该方法不会直接终止线程,只是通知线程要中断。

  10. isAlive():检查线程是否处于活动状态(已启动但尚未终止)。

boolean isActive = thread.isAlive();
  1. setDaemon(boolean on):设置守护线程。守护线程在所有非守护线程结束后自动结束。通常用作后台服务线程。
thread.setDaemon(true);  // 设置为守护线程
  1. getId():获取线程的唯一ID。

  2. getState():获取线程的当前状态(如 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED)。

Thread.State state = thread.getState();

线程的优先级

线程的优先级决定了线程获取 CPU 时间片的可能性,优先级高的线程更有可能先执行,但不能保证绝对顺序。线程优先级是一个整数,范围从 1到10。

  1. 默认优先级:线程默认的优先级是 5。可以通过 setPriority() 方法来设置优先级,使用 getPriority() 获取优先级。

     thread.setPriority(Thread.MAX_PRIORITY);  // 设置最高优先级 10
    
  2. 优先级范围

    • Thread.MIN_PRIORITY = 1(最低优先级)
    • Thread.NORM_PRIORITY = 5(默认优先级)
    • Thread.MAX_PRIORITY = 10(最高优先级)
  3. 优先级的影响
    虽然高优先级的线程有更大的机会获得 CPU 时间片,但这取决于操作系统的线程调度机制,不能完全依赖优先级来控制执行顺序。

线程的生命周期

Java 中线程的生命周期可以分为以下几个状态:

  1. NEW(新建)

    • 当线程对象被创建后但还没有调用 start() 方法时,线程处于新建状态。
    • 此时线程还没有运行,也没有分配任何系统资源。
    Thread thread = new Thread(new MyRunnable());
    
  2. RUNNABLE(可运行)

    • 线程已经调用 start() 方法,进入了就绪状态,等待 CPU 调度。
    • 线程进入就绪队列,一旦获得 CPU 时间片后就会进入运行状态。
    thread.start();  // 线程进入RUNNABLE状态
    
  3. BLOCKED(阻塞)

    • 当线程等待进入同步区域(如等待锁定某个对象时),它会进入阻塞状态。
    • 一旦获取到资源,线程会重新进入 RUNNABLE 状态。
  4. WAITING(等待)

    • 线程等待其他线程的通知或特定的事件(如调用 Object.wait()Thread.join() 等方法)时,进入等待状态。
    • 该状态下,线程不会消耗 CPU 资源,直到其他线程通过 notify()notifyAll() 解除等待。
  5. TIMED_WAITING(计时等待)

    • 线程进入一种有时间限制的等待状态,比如调用 Thread.sleep() 或带超时时间的 Object.wait(long timeout)
    • 到期后线程会自动从这个状态回到 RUNNABLE。
  6. TERMINATED(终止)

    • 线程执行完成或由于异常退出后,会进入终止状态。
    • 线程在此状态下无法再次启动。
    thread.join();  // 线程终止,进入TERMINATED状态
    

线程状态转换图


http://www.kler.cn/news/359329.html

相关文章:

  • Go语言Gin框架的常规配置和查询数据返回json示例
  • 以openai的gpt3 5为例的大模型流式输出实现(原始、Sanic、Flask)- 附免费的key
  • 内网穿透:如何借助Cloudflare连接没有公网的电脑的远程桌面(RDP)
  • 是德E5063矢量网络分析仪使用(一)单端口校准
  • 数据库运维实操优质文章文档分享(含Oracle、MySQL等) | 2024年9月刊
  • champ模型部署指南
  • QT IEEE754 16进制浮点数据转成10进制
  • JavaScript 中的防抖和节流(简易版)
  • 【人工智能-初级】第6章 决策树和随机森林:浅显易懂的介绍及Python实践
  • 信雅纳Chimera 100G网络损伤仪助力Parallel Wireless开展5G RAN无线前传网络的损伤模拟
  • 【论文学习与撰写】论文里的Mathtype公式复制粘贴,跨文档复制后错码/错位问题的解决
  • 设计模式,面试级别的详解(持续更新中)
  • EMC VNX2代产品base module的更换
  • 从0到1构建webpack多页面多环境应用
  • 前端求职简历-待补充
  • 代码随想录算法训练营第六十二天| prim算法,kruskal算法
  • Shell编程-函数
  • Git 总结
  • 软件开发----设计模式每日刷题(转载于牛客)
  • 测试教程分享