Java 入门 之 线程状态说明
来源:互联网 发布:淘宝子账号怎么登陆 编辑:程序博客网 时间:2024/06/03 22:58
线程状态从大的方面来说,可归结为:初始状态、可运行状态、不可运行状态和消亡状态,具体可细分为7个状态,说明如下:
1) 线程的实现有两种方式,一是继承 Thread 类,二是实现 Runnable 接口,但不管怎样,当我们 new 了 Thread 实例后,线程就进入了初始状态;
2) 当该对象调用了 start() 方法,就进入可运行状态;
3) 进入可运行状态后,当该对象被操作系统选中,获得 CPU 时间片就会进入运行状态;
4) 进入运行状态后 case 就比较多,大致有如下情形:
﹒run() 方法或 main() 方法结束后,线程就进入终止状态;
﹒当线程调用了自身的 sleep() 方法或其它线程的 join() 方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当 sleep() 结束或 join() 结束后,该线程进入可运行状态,继续等待OS分配时间片;
﹒当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被锁牢 (synchroniza,lock) ,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待 OS 分配 CPU 时间片;
﹒当线程调用 wait() 方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用 notify() 或 notifyAll() 方法才能被唤醒(由于 notify() 只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用 notifyAll() 方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。
﹒当线程调用 stop 方法,即可使线程进入消亡状态,但是由于 stop 方法是不安全的,不鼓励使用,大家可以通过 run 方法里的条件变通实现线程的 stop 。
java notify() 与 notifyAll() 的区别首先,使用wait方法和使用synchornized来分配 CPU 时间是有本质区别的。wait 会释放锁,synchornized 不释放锁。还有(wait / notify / notifyAll)只能在取得对象锁的时候才能调用。调用 notifyAll 通知所有线程继续执行,只能有一个线程在执行其余的线程在等待(因为在所有线程被唤醒的时候在 synchornized 块中)。这时的等待和调用notifyAll前的等待是不一样的。notifyAll前:在对象上休息区内休息。notifyAll后:在排队等待获得对象锁。notify 和 notifyAll都是把某个对象上休息区内的线程唤醒, notify 只能唤醒一个,但究竟是哪一个不能确定,而 notifyAll 则唤醒这个对象上的休息室中所有的线程。 一般有为了安全性,我们在绝对多数时候应该使用notifiAll(),除非你明确知道只唤醒其中的一个线程,至于有些书上说“notify 唤醒同一对象监视器中调用 wait 的第一个线程”是没有根据的,因为 SUN 公司是这样说的“The choice is arbitrary and occurs at the discretion of the implementation.”
- Java 入门 之 线程状态说明
- Java之线程状态
- JAVA 线程状态转换图示及说明
- java多线程之线程状态
- Java学习之线程状态
- Java多线程之线程状态
- java多线程之线程状态
- Java 线程状态之 WAITING
- Java基础之线程状态
- Java线程学习之线程状态
- 线程状态转换说明
- java学习之线程入门
- java多线程之线程状态(2)
- java多线程之线程状态(3)
- 自学java之线程状态转换
- java 多线程之线程的状态
- Java多线程之线程状态转换
- Java中的线程状态之终止
- tarjan在acm里的应用
- Java基础知识——Java数组详解
- meta中的viewport指令
- ios9与ios8的区别
- 优化程序性能的几个方法(来自于《深入理解计算机系统》)总结
- Java 入门 之 线程状态说明
- [JavaScript][兄弟节点] DOM节点解析
- raspberry-pi之DSI屏幕介绍及使用说明
- css样式分类
- Python学习笔记(1):语法基础
- spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别
- linux系统的运行级别
- jquery实现点击本页面非本小窗口(菜单)元素时,隐藏小窗口(适合页面中存在多个小提示窗口、菜单)
- ORACLE edit命令