线程在操作系统以及java中的几种状态(源码分析)

本文详细解释了操作系统和Java中线程的五种基本状态(新建、就绪、运行、阻塞、终止)以及Java特有的六种线程状态(包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED),并通过代码示例展示了这些状态在实际应用中的转换过程。
摘要由CSDN通过智能技术生成

操作系统中一般将线程划分为五种状态:新建、可运行(就绪)、运行、阻塞、终止

  1. 新建(New):当一个线程被创建时,它处于新建状态。此时,线程对象已经创建,但还没有分配到CPU资源。

  2. 就绪(Ready):当一个线程需要执行某个任务时,它会被放入就绪队列中。就绪队列中的线程等待CPU的调度,以获取执行权限。当有其他线程释放了CPU资源,并且该线程满足执行条件时,它将从就绪队列中取出并进入可运行状态。

  3. 运行(Running):当一个线程被分配到CPU资源后,它就会进入运行状态。此时,线程正在执行其任务,并占用CPU资源。

  4. 阻塞(Blocked):当一个线程在执行过程中遇到某种情况,如等待输入、等待I/O操作完成等,它可能会暂时停止执行,进入阻塞状态。阻塞状态下的线程不会消耗CPU资源,而是等待相应的事件发生后再恢复执行。

  5. 终止(Terminated):当一个线程完成任务或出现异常时,它会被标记为终止状态。此时,线程不再占用任何系统资源,可以安全地结束其生命周期。

线程状态在java中定义,通过查看Thred源码 我们会发现java将线程定义了六种状态,如下图所示:

  1. NEW:新建状态,表示线程刚被创建,但还没有调用start()方法。此时,线程对象已经创建,但还没有分配到CPU资源。

  2. RUNNABLE:可运行状态,表示线程已经调用了start()方法,等待CPU调度。此时,线程已经分配到了CPU资源,并准备执行任务。

  3. BLOCKED:阻塞状态,表示线程在等待锁的释放。当一个线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞,直到该锁被释放。

  4. WAITING:等待状态,表示线程正在等待某个条件的发生。例如,调用Object.wait()方法会使线程进入等待状态,直到其他线程调用Object.notify()或Object.notifyAll()方法唤醒它。

  5. TIMED_WAITING:限时等待状态,表示线程正在等待某个条件的发生,并且设置了等待时间。例如,调用Thread.sleep(long millis)方法会使线程进入限时等待状态,直到指定的时间过去或者被其他线程中断。

  6. TERMINATED:终止状态,表示线程已经完成任务或出现异常而结束。此时,线程不再占用任何系统资源,可以安全地结束其生命周期。

 代码演示

public class Main {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个新的线程
        Thread thread1 = new Thread(()-> System.out.println("1"));

        Thread thread2 = new Thread(()-> {
            while (true){

            }
        });
        thread2.start();

        Thread thread3 = new Thread(()-> {
            try {
                synchronized (Main.class){
                    Thread.sleep(10000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("3");
        });
        thread3.start();

        Thread thread4 = new Thread(()-> {
            try {
                thread2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("4");
        });
        thread4.start();

        Thread thread5 = new Thread(()-> {
            synchronized (Main.class){
                System.out.println("5");
            }
        });
        thread5.start();

        Thread thread6 = new Thread(()-> System.out.println("6"));
        thread6.start();
        thread6.join();
        System.out.println(thread1.getState());
        System.out.println(thread2.getState());
        System.out.println(thread3.getState());
        System.out.println(thread4.getState());
        System.out.println(thread5.getState());
        System.out.println(thread6.getState());
    }
}

运行结果:

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ADRU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值