**
浅谈JAVA线程状态
**
关于JAVA线程的状态,我专门去看了下JDK源码,其中就有这样一段:
上面说的很清楚,JAVA线程一共有六种状态,和操作系统线程并不是一一对应的,分别是:
NEW 新建状态
- new Thread() 会创建一个线程,此时为新建状态
RUN 运行状态
- Thread.start()方法,线程进入运行状态(operate system称就绪状态, JAVA中就绪和运行都是RUN)
- Thread.sleep(long mill) 方法时间结束,从超时等待状态到运行状态
- Object.notify() 正在等待Object对象锁的线程,当另外一个线程调用该锁对象的notify方法时,在该锁上等待的一个线程进入运行状态,抢占锁资源,抢不到,进入阻塞状态
- 当该线程调用Thread.sleep(long mill)时间还未结束时,有其他线程调用了该线程的interrupt()时,该线程会结束sleep,并抛出InterruptedException异常,并进入RUN状态
BLOCKED 阻塞状态
- 准备进入synchronized块或方法,但并未获得对象锁
- 已经进入synchronized块或方法,在synchronized块或方法里调用了锁对象的wait()方法,释放了锁资源,其他线程调用了该对象锁的notify或nitifyAll方法,唤醒一个或所有在该对象锁上等待的线程,则线程进入阻塞状态,等待锁资源
- 进入超时等待的线程,超时时间到了,自动进入阻塞状态,不用等被其他线程唤醒
WARTING 等待状态
- 目标线程调用其他线程的Thread.join(),目标线程进入等待状态
- 目标线程调用Thread.wait()
TIMED_WARTING 超时等待状态
- 目标线程调用Thread.wait(long mill)
- 目标线程调用其他线程的Thread.join(long mill)
- 目标线程调用Thread.sleep(long mill)
TERMINATED 结束状态
- 目标线程执行完成
- 目标线程调用了Thread.stop() (已不建议使用)
notify 和notifyAll 都是Object类的方法,下面介绍一下他们之间的区别:
notify: 唤醒在该对象锁上等待的一个线程,使该线程进入阻塞状态,等待锁资源
notifyAll:唤醒在该对象锁上等待的所有线程,全部进入阻塞状态,等待锁资源
细心的朋友可能会看到,源码中还有LockSupport 类的park()和unpark()方法
是的,但这个方法底层用的是UnSafe 对象,他不是JDK规范里面的,看他的名字就知道它不安全,感兴趣的朋友可以自己去看看源码,这里就不多讲了