今天是2017年5月一号,劳动人民的节日,希望我们守在实验室,和工作岗位的同志们,节日快乐。有条件的,晚上可以和家人一起吃顿丰盛的晚餐。我还在实验室,我特别想家,学校太远没有时间回去,化悲愤为力量,学习。
总结一下有关多线程的线程状态:
线程有如下6种状态,有的书上是5种,原因是把其中(计时等待的状态,归为等待)
1、New(新创建)
2、Runnable(可运行)
3、Blocked(被阻塞)
4、Waiting(等待)
5、Timed Waiting(计时等待)
6、Terminated(被终止)
有关以上6中运行状态,做一下详细的汇总:
新创建
指的是,用new操作符创建一个新的线程时,如new Thread(Mythread),该线程还没有开始运行,只是告诉虚拟机,创建了一个线程,此时线程处于新创建的状态,里面的代码并未执行。
可运行
当创建的线程,调用了start方法,线程就处于可运行状态。一个可运行的状态并不是说运行就运行,它只是具备了能够运行的能力,具体何时运行,我们并不知道,我们只需要知道,它具备了这种运行的能力。一旦CPU安排何时的时间片给它,它就会不定时运行。任何时候,一个可运行的线程可能正在运行,也可能并没有运行。取决于,CPU的调度机制,以及线程的优先级有关。
被阻塞和等待线程
当线程处于被阻塞和等待状态的时候,它暂时不活动。直到线程调度器重新激活它。
1.当一个线程试图获取一个内部的对象锁的时候,而该锁被其它线程持有,则该线程进入到阻塞状态。当所有其它线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程就会变成一个非阻塞状态。
2.当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。比如:在调用Object.wait方法或者Thread.join方法时,或者是等待java.util.concurrent库中的Lock或者Condition时,就会出现这种情况。
3.有几个方法有一个超时参数,调用它们将导致线程进入计时等待状态。带有超时参数的方法有Thread.sleep和Object.wait、Thread.join、Lock.tryLock以及Condition.await的计时版。
被终止的线程
线程终止有如下两种原因:
1.因为run方法正常退出而自然死亡。
2.因为一个没有被捕获的异常终止了run方法,而意外死亡。