线程的状态
参考资料:https://www.cnblogs.com/happy...
参考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()
方法执行结束后,该线程就结束了。
图示:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。