【面试:并发篇01:java的六种线程状态】
java的六种线程状态
1.NEW-新建(新创建的线程对象就是NEW,不是可运行状态 不会让cpu处理)2.RUNNABLE-可运行(新创建的线程对象start后才会变成可运行状态,cpu处理)
4.BLOCKED-阻塞(当线程争抢锁失败后变为阻塞状态,获取锁成功后又从阻塞状态变为可运行运行状态)
5.WAITING-等待(如果争抢锁成功 但是当前线程不满足某些条件 调用wait方法 暂时释放锁 当前线程进入wait状态,在条件满足时 由其他线程调用notify方法 唤醒等待线程 然后再去争抢锁 如果成功则进入可运行状态,如果不成功进入阻塞状态)
6.TIMED_WAITING-等待(有时限)(设置一个时间,如果等待的时间到了会自己唤醒 或者 在时间之内被notify唤醒),补充这种等待可以通过sleep(time)进行转换 不需要和锁有关系,就是sleep后进入TIMED_WAITING状态 时间到了恢复
3.TERMINATED-终结(线程走到尽头,释放线程)
六种线程状态原理图
阻塞与等待的逻辑关系:
假如新建有多个线程并start后 进入可运行状态 但是有一个部分需要线程同步,此时多个线程争抢一把锁,假如线程1争抢成功,那么其它线程进入阻塞状态,线程1如果不满足某些条件则进入等待状态 释放锁,现在其它线程开始争抢锁,如果线程2争抢成功 那么除线程1线程2之外其它的线程陷入阻塞状态 线程2完成了线程1的某些条件 线程2完成自己的任务释放锁,现在除线程1之外的所有线程再来争抢这把锁,现在线程3争抢成功 并且完成了线程1所需要的所有条件 现在唤醒线程1 线程3完成自己的任务释放锁,现在因为线程1被唤醒时线程3还没有释放锁 所以 线程1由等待状态变成了阻塞状态 然后线程3释放锁,所以现在 所有的线程(包括线程1)开始争抢锁。