2. 线程组 与 优先级
2.1 线程组 ThreadGroup
线程组是一个树状的结构,每个线程组下面可以有很多线程或者线程组。
- 线程依赖于线程组而存在。
- 线程组可以统一控制线程的优先级和检查线程的权限。
- 线程组中的线程只允许访问自己所在线程组的信息,不允许访问其他线程组的信息,包括父线程组或其他任何线程组。
创建新线程时,若没有显式指定所属线程组,则将父线程所在的线程组作为自己的线程组。
2.1.1 线程组方法
- 新建线程组:
ThreadGroup threadGroup = new ThreadGroup("groupName");
- 获取当前线程组:
Thread.currentThread().getThreadGroup()
2.1.2 ThreadGroup 成员变量
public class ThreadGroup implements Thread.UncaughtExceptionHandler {
private final ThreadGroup parent; // 父线程组
String name; // 线程组名称
int maxPriority; // 线程最大优先级
boolean destroyed; // 是否已被销毁
boolean daemon; // 是否为守护线程
boolean vmAllowSuspension; // 是否允许中断
int nUnstartedThreads = 0; // 还未启动的线程数目
int nthreads; // ThreadGroup 中线程数目
Thread threads[]; // ThreadGroup 中的线程数组
// 一个线程组可以包含其他线程组
int ngroups; // 下属的线程组数目
ThreadGroup groups[]; // 下属的线程组数组
}
2.2 优先级
java 线程优先级范围 : 1 - 10
, 可以自己设定。
- 该优先级只是给操作系统一个参考值,最终优先级决定权在于 操作系统,依赖于具体的线程调度算法。
- 默认线程优先级为
5
。 Thread
类的实例方法setPriority(优先级)
方法来设置优先级。
线程调度可以通过设置线程的优先级来给操作系统建议,但是线程调度最终还是操作系统决定。Java 中线程优先级有十种。
- 操作系统的优先级数目可能比 Java 少,如 Windows 中就只有 7 种,所以 Java 中不同的优先级可能对应到相同的操作系统优先级。
- 优先级可能会被系统自动改变。
2.2.1 线程调度器
Java 线程调度器来监视和控制处于 Runnable 状态的线程。
线程的调度策略采用 抢占式。
- 优先级高的优先执行
- 优先级相同时,先到先得
2.2.2 守护线程 Daemon
Java 中存在两类线程:
- 用户线程:平常所创建的线程
- 守护线程:为用户线程服务的线程
- 若存在任意的非守护线程,则守护线程仍工作
- 当所有非守护线程结束时,则守护线程也自动结束,JVM 退出
在线程 start()
前,可以设置守护线程 thread.setDaemon(true)
- Daemon 线程的子线程也是 Daemon 线程
- Daemon 线程不能访问固有资源,比如读写或计算等。因为它随时可能被中断。