美文网首页
多线程状态切换(转载)

多线程状态切换(转载)

作者: 丈母娘请留步 | 来源:发表于2017-02-20 10:51 被阅读0次

原文地址  http://zy19982004.iteye.com/blog/1626916

一.线程的状态图

二.初始状态

实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态

三.可运行状态

可运行状态只是说你资格运行,调度程序没有挑选到你,你就永远是可运行状态。

调用线程的start()方法,此线程进入可运行状态。

当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入可运行状态。

当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入可运行状态。

锁池里的线程拿到对象锁后,进入可运行状态。

四.运行状态

线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。

五.死亡状态

当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。

在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

六.阻塞状态

当前线程T调用Thread.sleep()方法,当前线程进入阻塞状态。

运行在当前线程里的其它线程t2调用join()方法,当前线程进入阻塞状态。

等待用户输入的时候,当前线程进入阻塞状态。

七.等待队列(本是Object里的方法,但影响了线程)

调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。

与等待队列相关的步骤和图

线程1获取对象A的锁,正在使用对象A。

线程1调用对象A的wait()方法。

线程1释放对象A的锁,并马上进入等待队列。

锁池里面的对象争抢对象A的锁。

线程5获得对象A的锁,进入synchronized块,使用对象A。

线程5调用对象A的notifyAll()方法,唤醒所有线程,所有线程进入锁池。||||| 线程5调用对象A的notify()方法,唤醒一个线程,不知道会唤醒谁,被唤醒的那个线程进入锁池。

notifyAll()方法所在synchronized结束,线程5释放对象A的锁。

锁池里面的线程争抢对象锁,但线程1什么时候能抢到就不知道了。||||| 原本锁池+第6步被唤醒的线程一起争抢对象锁。

八.锁池状态

当前线程想调用对象A的同步方法时,发现对象A的锁被别的线程占有,此时当前线程进入锁池状态。简言之,锁池里面放的都是想争夺对象锁的线程。

当一个线程1被另外一个线程2唤醒时,1线程进入锁池状态,去争夺对象锁。

锁池是在同步的环境下才有的概念,一个对象对应一个锁池。

九.几个方法的比较

Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入阻塞,但不释放对象锁,millis后线程自动苏醒进入可运行状态。作用:给其它线程执行机会的最佳方式。

Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的cpu时间片,由运行状态变会可运行状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。

t.join()/t.join(long millis),当前线程里调用其它线程1的join方法,当前线程阻塞,但不释放对象锁,直到线程1执行完毕或者millis时间到,当前线程进入可运行状态。

obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout)timeout时间到自动唤醒。

obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。

相关文章

  • 多线程状态切换(转载)

    原文地址 http://zy19982004.iteye.com/blog/1626916 一.线程的状态图 二....

  • Java多线程系列(二)——多线程的调度

    前言 在上一篇文章中,我们介绍了多线程的基本概念和生命周期等内容,本篇文章将着重对多线程的调度,即多线程状态的切换...

  • Java线程的5种状态及切换

    Java线程的5种状态及切换 thread的run 和start的区别:多线程-Thread的run()与star...

  • 多线程基础——拾遗

    主要内容 线程组的使用 切换线程状态的的方法 SimpleDataFormat类与多线程的解决办法 处理线程异常的...

  • 状态切换

    最近任务有些多,经常需要在多任务之间切换,工作环境也多次切换,整个人的效率严重下滑。 这个局面该怎么应对呢? 多任...

  • Android输入法IMMS服务启动流程(5)(onUnlock

    目录 user状态切换 手机重启时,用户空间状态切换顺序: 用户的各个状态切换实在UserController完成...

  • iOS - 多线程NSThread的使用

    一、多线程的基本概念: 1. 多线程的原理: 多线程是循环切换执行的 线程执行完毕之后会自动销毁 2. 多线程的优...

  • GCD

    转载 iOS多线程:『GCD』详尽总结

  • Sonoff Tasmota 使用指南

    一、按钮功能 1次短按:切换开关状态。2次短按:切换开关状态。对于Sonoff Dual,切换开关2状态。3次短按...

  • java并发编程艺术笔记

    1. 并发编程遇到的挑战 多线程 减少上下文切换的方式: 无锁并发编程:多线程竞争锁的时候会引起上下文的切换,在多...

网友评论

      本文标题:多线程状态切换(转载)

      本文链接:https://www.haomeiwen.com/subject/nlbswttx.html