Java中线程的5种状态

线程的状态

参考资料: https://www.cnblogs.com/happy...

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

关于线程的理解,咱们将一个线程当作是一个任务task,这样应该更好理解。app

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

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

无限等待 线程

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

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

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

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

1、线程的5种状态

新建(New) :使用new Thread() 建立一个线程以后。队列

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

无限等待(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() 方法执行结束后,该线程就结束了。

图示:

线程状态

相关文章
相关标签/搜索