目录
线程的状态
线程是有状态的,并且这些状态之间也是可以互相流转的。Java中线程的状态分为6种:
- 1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
- 2.运行(RUNNABLE):Java线程中将就绪(READY)和运行中(RUNNING)两种状态笼统的称为“运行”。
- 就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中并分配cpu使用权 。
- 运行中(RUNNING):就绪(READY)的线程获得了cpu 时间片,开始执行程序代码。
- 3.阻塞(BLOCKED):表示线程阻塞于锁(关于锁,在后面章节会介绍)。
- 4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
- 5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
- 6. 终止(TERMINATED):表示该线程已经执行完毕。
下图是一张线程状态的流转图:
线程的优先级
我们学习过,Java虚拟机采用抢占式调度模型。也就是说他会给优先级更高的线程优先分配CPU。虽然Java线程调度是系统自动完成的,但是我们还是可以“建议”系统给某些线程多分配一点执行时间,另外的一些线程则可以少分配一点——这项操作可以通过设置线程优先级来完成。Java语言一共设置了10个级别的线程优先级(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在两个线程同时处于Ready状态时,优先级越高的线程越容易被系统选择执行。Java 线程优先级使用 1 ~ 10 的整数表示。默认的优先级是5。
最低优先级 1:Thread.MIN_PRIORITY
最高优先级 10:Thread.MAX_PRIORITY
普通优先级 5:Thread.NORM_PRIORITY
在Java中,可以使用Thread类的setPriority()
方法为线程设置了新的优先级。getPriority()
方法返回线程的当前优先级。当创建一个线程时,其默认优先级是创建该线程的线程的优先级。
以下代码演示如何设置和获取线程的优先:
/**
* @author Hollis
*/
public class Main {
public static void main(String[] args) {
Thread t = Thread.currentThread();
System.out.println("Main Thread Priority:" + t.getPriority());
Thread t1 = new Thread();
System.out.println("Thread(t1) Priority:" + t1.getPriority());
t1.setPriority(Thread.MAX_PRIORITY - 1);
System.out.println("Thread(t1) Priority:" + t1.getPriority());
t.setPriority(Thread.NORM_PRIORITY);
System.out.println("Main Thread Priority:" + t.getPriority());
Thread t2 = new Thread();
System.out.println("Thread(t2) Priority:" + t2.getPriority());
// Change thread t2 priority to minimum
t2.setPriority(Thread.MIN_PRIORITY);
System.out.println("Thread(t2) Priority:" + t2.getPriority());
}
}
输出结果为:
在上面的代码中,Java虚拟机启动时,就会通过main方法启动一个线程,JVM就会一直运行下去,直到以下任意一个条件发生:
- 调用了exit()方法,并且exit()有权限被正常执行。
- 所有的“非守护线程”都死了(即JVM中仅仅只有“守护线程”)。
每日寄语
愿中国青年都摆脱冷气,只是向上走,不必听自暴自弃者流的话。能做事的做事,能发声的发声,有一分热,发一分光,就令萤火虫一般,也可以在黑暗里发一点光,不必等候炬火。此后如竟没有炬火,我便是唯一的光。——鲁迅