一、线程的六种状态以及转化
1、线程的生命周期
1)New(新建状态):new Thread()创建一个Thread对象
2)Runnable(就绪状态):线程对象此时调用start方法,此时在JVM进程中创建了一个线程
3)Blocked(阻塞状态):等到一个监视器锁进入到同步代码块或者同步方法中,没有获取到lock时等待的线程会从Runnable状态转化为Blocked状态
4)Waiting(等待状态):调用Object.wait()/join()/LockSupport.park()等方法,此时线程从Runnable状态转换到Waiting状态
5)Timed_Waiting(睡眠状态):调用带超时参数的Thread.sleep(long millis)/Object.wait(long timeout)/join(long milles)/LockSupport.parkNanos()/LockSupport.parkUntil等方法都会使得当前线程进入到Timed_Waiting状态
6)Terminated(终止状态): 是线程的最终状态,说明线程生命周期结束
进入Terminated状态的情况
1、线程运行完毕,结束生命周期
2、线程在运行过程中出现错误,意外结束
3、JVM crash,导致所有的线程都结束
2、图解线程的六种状态以及转化
二、线程中常用的方法
1、start() 方法
start() 方法用来启动一个线程,将其添加一个线程组当中,此时线程就会处于Runnable就绪状态。
2、sleep()方法
sleep()方法是将当前线程指定休眠时间,进入到休眠状态,暂停执行,不会放弃monitor锁的使用权。
TimeUnit和sleep方法类似,对sleep方法对其进行了封装省去了时间单位换算的步骤。
3、yield()方法
yield()是一种启发式方法,线程A.yield(),会提醒调度器线程A愿意放弃本次的cpu资源,如果cpu资源不紧张,处理器有可能会忽略这种提示。
yield()方法和sleep()方法的区别:
1)sleep()方法不会放弃cpu时间片,只是是当前线程暂停执行。
2)sleep()方法使用interrupt捕捉中断信号,yield()方法不会。
3)yield()方法放弃cpu时间片是不确定的,如果cpu资源不紧张,处理器有可能会忽略这种提示。
4)yield()方法会使线程从Running状态转化为Runnable状态。
4、join()方法
线程A调用join()方法会使线程A所处的线程B进入到等待状态,直到线程A执行完毕或达到join方法的超时时间,线程B才可以执行。
5、中断方法
1)interrupt() 将java线程当中的中断状态位置为true
2)sleep()/join()/wait throw InterruptedException 可中断方法
3)isInterrupted() 判断中断状态位是否位true
4)interrupted() 判断中断状态位是否为true
6、wait/notify/notifyAll
1)wait调用该synchornized同步代码块或方法当中,使得当前线程进入阻塞状态。
2)notify/notifyAll唤醒当前的阻塞。