【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状态
    

线程状态转换图

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虫本初阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值