线程的状态与调度
来源:互联网 发布:js只选择小时分钟控件 编辑:程序博客网 时间:2024/06/05 04:45
线程的运行状态
一个线程从创建、运行到结束总是处于下面的六种状态之一,这些状态的值被封装在java.lang.Thread.State枚举中: - NEW:新建状态。空的线程对象,系统并没有为其分配资源;此时仅可以启动线程,调用任何其他方法都是无意义的,并且会引发IllegalThreadStateException异常 - RUNNABLE:可运行状态。当处于新建状态的进程调用了start方法并**返回后**,线程处于该状态。(处于可运行状态的线程并不一定立即运行run方法,线程还必须与其他线程竞争CPU时间,只有获得CPU时间才可以运行进程) - BLOCKED:阻塞状态。正在运行的线程没有运行结束,暂时让出CPU时间,此时其他处于可运行状态的线程就可以获得CPU时间。(处于阻塞状态的原因有很多,如缺少某种资源等) - WAITING:无限期等待状态。当线程调用wait方法时进入该状态,直到另一个线程调用了该对象的notify方法或notifyAll方法 - TIMED_WAITING:等待指定时间状态。当线程调用sleep方法时线程进入该状态,在指定时间过后线程再次进入可运行状态。 - TERMINATED:结束状态。线程正常结束,即run方法返回,线程运行就结束了。
线程的优先级和调度
每个线程都有一个优先级,当多个线程处于可运行状态时,线程调度器根据线程的优先级调度线程运行,设置和返回优先级的方法如下:
public final void setPriority(int newPriority) //设置线程的优先级 public final int getPriority() //返回线程的优先级 /** * 优先级取值为1~10的整数,数值越大优先级越高。 * 也可以使用Thread类定义的常量来设置线程的优先级, * MIN_PRIORITY、NORM_PRIORITY、MAX_PRIORITY * 优先级分别对应于1、5、10 * 创建线程时如果没有指定优先级,则从创建该线程那里继承优先级 * 一般来说,只有当线程停止运行或由于某种原因被阻塞,较低优先级的线程才有机会运行。 */
代码示例:`public class ThreadDemo extends Thread{ThreadDemo(String name){ super(name);}@Overridepublic void run() { // TODO Auto-generated method stub for (int i = 0; i < 10; i++) { System.out.println(getName() + ":" + i); try { Thread.sleep((int)Math.random()*100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(getName() + "结束.");}public static void main(String[] args) { ThreadDemo t1 = new ThreadDemo("线程A"); ThreadDemo t2 = new ThreadDemo("线程B"); t1.setPriority(MAX_PRIORITY); t2.setPriority(NORM_PRIORITY); t1.start(); t2.start(); }}`运行结果:` 线程A:0 线程B:0 线程A:1 ... 线程A:9 线程B:1 线程A结束. 线程B:2 ... 线程B:9 线程B结束.`线程A应该先结束,因为它的优先级高,会获得较多的CPU时间执行。
控制线程的结束
1. 如果run方法是一个确定次数的循环,当run方法结束后,线程运行就结束了。2. 如果run方法是一个不确定循环, 如`public void run () { while (true) { } } 可以在程序中通过改变标志变量的值实现结束进程。
new Runnable{ boolean flag = true; public void run () { while (flag) { //关键代码 } } public void stopRun () { flag = false; } }
`
0 0
- 线程的状态与调度
- 线程的状态与调度
- 线程的状态、调度及线程的同步与锁
- 多线程篇3 线程的状态与调度
- 线程状态和调度
- 线程状态转换调度
- 线程的调度与切换
- 线程的调度与控制
- 【Java学习笔记】12:线程的状态转换2与优先级调度
- java线程调度方式以及线程的状态转换讲解
- Linux的进程,线程以及调度(fork与僵尸,内存泄漏,task结构体,停止状态与作业控制)
- 进程、线程与处理器的调度
- 进程、线程与处理器的调度
- 进程、线程与处理器的调度
- 线程的生命周期与线程状态
- 13.3线程的生命周期与线程状态
- 线程的生命周期与线程状态(二)
- 线程的调度与控制 线程的生命周期
- NOIP2016备赛试题
- 数据结构——树的水平遍历
- python数据结构学习笔记-2016-11-26-01-链表排序
- 线程管理之---信号量的操作
- java 堆栈
- 线程的状态与调度
- Java分布式应用技术架构介绍
- ORA-32004 问题的原因及解决
- 学习隐马尔科夫HMM,通俗易懂
- AndroidStudio插件使用之:GsonFormat
- opencv RGB三通道分离
- Java中的序列化与反序列化
- 欢迎使用CSDN-markdown编辑器
- 单体应用与微服务优缺点辨析