线程的状态
NEW:新建
RUNNABLE:可运行
BLOCKED:阻塞
WAITING:等待
TIMED_WAITING:计时等待
TERMINATED:终止
1 NEW
当用new操作符创建一个新线程时,这个线程还没开始运行,此时就是新建状态(NEW)。仅仅由Java虚报机为其分配了内存,没有表现出任何线程的动态特征。当一个线程处于新建状态时,程序还没开始运行线程中的代码。
2 RUNNABLE
一旦调用start方法,线程就处于RUNNABLE状态,一个可运行状态的线程可能正在运行也可能没运行,由操作系统为线程提供具体的CPU运行时间片,Java规范没有将“正在运行“作为一个单独状态,一个正在运行的线程仍然处于RUNNABLE状态。
一旦一个线程开始运行,它不一定始终保持运行,有时需要暂停让其他线程有机会运行。具体调度细节依赖于操作系统,抢占式调度的方式给每一个可运行线程一个时间片来运行,时间片用完后,操作系统会剥夺该线程的运行权(线程占有的CPU资源)给其他另一个线程,并且会考虑线程的优先级。
3 BLOCKED,WAITING,TIMED_WAITING
当线程处于阻塞或等待状态时暂时是不活动的,不执行任何代码并消耗最少的资源。
当线程调用了一个阻塞式的IO方法时,该线程就会进人阻塞状态,如果想进人就绪状态就必须要等到这个阻塞的IO方法返回。
当线程调用了某个对象的wait ( )方法时,也会使线程进人阻塞状态,如果想进入就绪状态就需要使用notify ( )方法唤醒该线程。
当线程调用了Thread的sleep (long millis)方法时,也会使线程进人阻塞状态,在这种情况下,只需等到线程睡眠的时间到了以后,线程就会自动进人就绪状态。
当在一个线程中调用了另 一个线程的join ()方法时,会使当前线程进人阻塞状态,在这种情况下,需要等到新加人的线程运行结束后才会结束阻塞状态,进入就绪状态。
当线程试图获取某个对象的同步锁时,如果该锁被其他线程所持有,则当前线程会进人阻塞状态。如果想从阻塞状态进人就绪状态必须得获取到其他线程所持有的锁。
当一个线程尝试获取一个内部的对象锁(不是java.util.concurrent库中的Lock),同时这个锁当前被其他线程占有,这个线程就会被阻塞。当所有其他线程都释放了这个锁并且线程调度器允许该线程持有这个锁时,这个线程就变成非阻塞状态。
当线程等待另一个线程通知调度器出现某个条件时就会进入等待状态,调用Object.wait或Thread.join方法或等待java.util.concurrent库中的Lock或Condition时就会出现这种情况,实际上阻塞状态与等待状态没有太大区别。
通过调用Thread.sleep、计时版Object.wait、Thread.join、Lock.tryLock以及Condition.await方法,会让线程进入TIME_WAITING(计时等待),这一状态将保持到超时期或者接收到适当的通知。
当一个线程阻塞或等待或终止时,可以调度另一个线程运行,当一个线程被重新激活时,线程调度器会检查它是否具有比当前运行线程更高的优先级,如果是这样,调度器会剥夺某个当前正在运行线程的运行权,选择运行一个新线程。
4 终止线程
由于run方法正常结束退出,线程自然终止,
因为一个没有捕获的异常终止了run方法,使线程意外终止。
调用stop方法杀死一个线程。
不推荐使用JDK提供的stop()、destroy()方法。【已废弃】
推荐线程自己停止下来
建议使用一个标志位进行终止变量当flag=false,则终止线程运行。
5 获取线程状态的方法
getState()