欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
线程的生命周期包含5个阶段
新建、就绪、运行、阻塞、终止
新建(new Thread):
就是刚使用new方法,new出来的线程;
就绪(Runnable):
就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
运行(Running):
当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
阻塞(Blocked):
在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,
这个时候需要其他机制将处于阻塞状态的线程唤醒,
比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
终止(Terminated):
如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;
中断
如果一个线程处于了阻塞状态
(如线程调用了thread.sleep、thread.join、thread.wait、condition.await、以及可中断的通道上的 I/O 操作方法后可进入阻塞状态):
则在线程在检查中断标识时如果发现中断标示为true,则会在这些阻塞方法调用处抛出InterruptedException异常,
抛出异常是为了线程从阻塞状态醒过来。
并且在抛出异常后立即将线程的中断标别位清除,即重新设置为false。
synchronized与reentrantLock.lock()是不可中断的:
如果发生死锁,那么synchronized与reentrantLock.lock()方法无法终止,一直阻塞到它获取到锁为止。
如果调用带超时的tryLock方法reentrantLock.tryLock(long timeout, TimeUnit unit),
那么如果线程在等待时被中断,将抛出一个InterruptedException异常,这是一个非常有用的特性,因为它允许程序打破死锁。
也可以调用reentrantLock.lockInterruptibly()方法,它就相当于一个超时设为无限的tryLock方法。
处理中断的方法:
try {
while (!Thread.currentThread().isInterrupted() && more work to do) {
do more work;
}
} catch (InterruptedException e) {
//线程在wait或sleep期间被中断了
} finally {
//线程结束前做一些清理工作
}