java多线程运行状态

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方法类似,只是去掉超时时间;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。