java多线程运行状态
2020-07-24 本文已影响0人
MrShen_1eaa
image.png
image.png
image.png
线程状态从大的方面来说,可归结为:初始状态、就绪状态、运行状态、阻塞状态和消亡状态,具体可细分为上图所示7个状态,说明如下:
- 1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,三是实现Callable接口,但不管怎样,当我们new了Thread实例后,线程就进入了初始状态;
- 2、当该对象调用了start()方法,就进入就绪状态;
- 3、进入就绪状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;
- 4、进入运行状态后涉及的情况就比较多,大致有如下情形:
- run()方法或main()方法结束后,线程就进入终止状态;
- 当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态虽停止当前线程,但并不释放所占有的资源);
- 当sleep()结束或join()结束后,该线程进入就绪状态,继续等待OS分配时间片;
- 当线程刚进入就绪状态(注意,还没运行),发现将要调用的资源被锁住(synchroniza,lock),将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入就绪状态,等待OS分配 CPU时间片;
- 当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由于不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。 当线程调用stop方法,即可使线程进入消亡状态,但是由于stop方法是不安全的,不鼓励使用,大家可以通过run方法里的条件变通实现线程的 stop。
1、触发--->BLOCKED状态方法:
- Synchronized修饰实例方法,加对象锁;
- Synchronized修饰类,加类锁;
- Synchronized修饰代码块,加锁;
2、触发--->TIMED_WAITING状态方法:
- Thread.sleep(long);
- Object.wait(long);
- Thread.join(long);
- LockSupport.parkNanos(long);
- LockSupport.parkUntil(long);
3、触发--->WAITING状态方法:
与触发TIMED_WAITING方法类似,只是去掉超时时间;