JAVA中线程的六种状态
目录
1.new 创建线程
此时只是java语言层面的创建,操作系统并没有真正的创建线程,只有调用start()方法时,线程进入可运行状态(RUNNABLE)
2.RUNNABLE(运行状态)
此状态又包含就绪状态和运行状态,程序调用start()方法后,操作系统会创建一个线程,然后等待cpu调配,此时线程处于就绪状态,当线程获得cpu执行权后,线程进入运行状态。也可以通过yeild()方法,切换到就绪状态。
3.TIME_WAITING(限时等待状态)
RUNNABLE状态时,调用sleep(long)、wait(long)、join(long)、LockSupport.partUnit(xx)进入TIME_WAITING。此时可通过notify()、notifyAll()、LockSupport.unpart()方法进次入RUNNABLE状态。
4.WAITING(无限等待状态)
RUNNABLE状态时,调用sleep()、wait()、join()、LockSupport.park()进入WAITING。此时可通过notify()、notifyAll()、LockSupport.unpart()方法进次入RUNNABLE状态。
5.BLOCKED(阻塞状态)
RUNNABLE状态时,如果遇到锁被抢占的情况,如果抢不到锁,就会进入BLOCKED状态,当抢占到锁的情况下,又会再次进入RUNNABLE状态。
6.TERMINATED(终止状态)
线程运行结束,终止线程有两种方式。stop()强制杀死线程,但是此方法不建议使用,如果强制终止,可能会造成数据不完整。然后就是interrupt()(建议使用),如果线程在WAITING、TIME_WAITING状态,都会try/catch一个InterruptedException e异常,共享变量Thread.currentThread().isInterrupted(),默认是false,当线程调用interrupt()时,会经历一个把变量Thread.currentThread().isInterrupted()值变成true,然后抛出InterruptedException 异常,然后再把变量Thread.currentThread().isInterrupted()复位的过程,如果线程在睡眠中,可以不用等到线程睡醒而直接唤醒线程。此时可以在catch里由线程自己处理结果。
isInterrupted()标记线程是否被中断
interrupt()把isInterrupted()从默认值false修改为ture
interrupted()清除线程的中断状态,即把isInterrupted()修改为默认值false,如果当前线程是中断状态,就清除中断标记,返回true,如果当前线程非中断状态,就返回false