java线程5种状态_Java中线程的5种状态

本文详细介绍了Java线程的五种状态——新建、运行、无限等待、有限等待和结束,并通过实例解析了无限等待的两种情况,如Thread.join()和Object.wait()。线程状态的理解有助于优化并发编程,掌握线程的生命周期对于提升程序性能至关重要。
摘要由CSDN通过智能技术生成

线程的状态

参考JVM虚拟机一书的内容,进行总结。

关于线程的理解,我们将一个线程看成是一个任务task,这样应该更好理解。

每一个线程就是一个任务,我们要执行一个任务,这个任务如果完成了,那么我们的程序功能就得到了实现。

因为只有一个CPU,也就是说只有一个干活的人。那么我们开始了那么多的任务,CPU就需要频繁地切换任务来执行,这样我们就能更好地理解任务的一些状态了。

无限等待

对于无线等待的任务,第一种情况。

假设有任务A和任务B,我们在任务B的执行代码中:A.join(); ,这表示把任务B放在任务A的后面执行,那么任务B只有等待任务A做完之后才可以继续执行(准确地说是进入运行状态)。也就是说我们无法确定任务B等待的时间,这取决于任务A,所以这叫做无限等待。

对于无限等待的任务,第二种情况。

假设有任务C和任务D,我们在任务C的执行代码中:Object.wait() ,这表示把任务C搁置,让它无限等待下去。任务C什么时候可以继续执行呢?只有当其他任务调用了notify() 、notifyAll() 方法之后,这表示CPU将去看看那些无限等待的任务(特指使用了wait() 方法而等待的任务),然后把它们唤醒(这些任务又进入了运行状态)。这种情况下,我们无法确定任务C等待的时间,这取决于notify() 和notifyAll() 方法的通知,这就是无限等待的第二种情况。

一、线程的5种状态

新建(New) :使用new Thread() 创建一个线程之后。

运行(Runnable) :使用Thread.start() 方法之后。启动一个线程,该线程会进入等待队列等待CPU的执行,因此可以细分为runnable和running状态。

无限等待(waiting) :处于这种状态的线程,不会被分配CPU执行时间,需要等待其他线程显式地唤醒,然后进入运行状态。

调用Thread.join() 方法。将会一直等待上一个线程的执行结束,然后被上一个线程唤醒。

调用Object.wait() 方法。将会一直等待,直到其他线程中使用了notify()、notifyAll()进行唤醒。

有限等待(timed waiting) :处于这种状态的线程,不会被分配CPU执行时间,既可以被其他线程显式地唤醒,也可以在一定时间后由系统自动唤醒,然后进入运行状态。

调用Thread.sleep(timeout) 方法。该方法不会释放持有的对象锁。

调用Object.wait(timeout) 方法。该方法会释放持有的锁。

调用Thread.join(timeout) 方法。

阻塞(blocked) :阻塞和等待的区别在于,阻塞是在等待获取一个排它锁,因为该线程获取不到锁所以被阻塞住而不能允许;而等待则是等待一段时间或者是等待被唤醒,等待状态并不是等待获取锁。这个状态有个特点,一个线程请求锁,得到之后该线程进入阻塞状态;而其他线程再来请求锁,由于得不到而阻塞;当该锁释放后,被阻塞的线程得到锁就进入了运行状态。

由synchronized 修饰的代码块、方法。使得线程之间有并行变成串行执行。

IO操作,也是串行执行。

结束(terminated) :当线程的run() 方法执行结束后,该线程就结束了。

图示:

5ae56edd597f0f46c59ee8b036357acc.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值