2.线程组 与 优先级


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 线程不能访问固有资源,比如读写或计算等。因为它随时可能被中断。

文章作者: Yu Yang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Yu Yang !
 上一篇
ReentrantLock 与 synchronized ReentrantLock 与 synchronized
ReentrantLock 与 synchronized1. synchronized 与 ReentrantLock 的对比synchronized 与 ReentrantLock 都具备线程重入性,但 synchronized 由 JV
下一篇 
Java 锁分类 Java 锁分类
Java 中的锁 Java 中的并发包: java.util.concurrent , 又叫 JUC。 1. 乐观锁 与 悲观锁 1.1 乐观锁乐观锁总是假设对共享资源的访问没有冲突,线程可以不停地执行,无需加锁,也无需等待。 一旦多个线程
  目录