Java线程组和线程优先级

Laughing
2025-04-24 / 0 评论 / 7 阅读 / 搜一下 / 正在检测是否收录...

一、线程组

Java中ThreadGroup表示线程组,每个线程比如属于一个线程组,创建线程时,如果没有指定线程组,那么新创建的线程默认属于其父线程所在线程组。

public class ThreadDemo {
    public static void main(String[] args) {
        Thread testThread = new Thread(() -> {
            System.out.println("测试线程组:" + Thread.currentThread().getThreadGroup().getName());
            System.out.println("测试线程名:" + Thread.currentThread().getName());
        });
        testThread.start();
        System.out.println("main线程名:" + Thread.currentThread().getName());
    }
}

线程组管理其中的线程,线程组是一个标准的树状结构,这样涉及的原因是防止“上级”线程被“下级”线程引用而无法进行有效的GC回收。

二、线程优先级

Java中线程优先级是支持指定的,范围是1-10,但并不是所有操作系统都支持10级优先级,,Java只给操作系统一个优先级的参考量,线程在操作系统中最终的优先级还是有操作系统决定的。

线程默认优先级是5,线程的执行顺序由调度程序来决定,通常情况下,高优先级的线程会比低优先级的线程有更高的机率得到执行。

import java.util.stream.IntStream;

public class ThreadDemo {
    public static void main(String[] args) {
        IntStream.range(1, 10).forEach(i -> {
            Thread thread = new Thread(() -> {
                System.out.println(String.format("当前线程名称%s,优先级%s", Thread.currentThread().getName(),
                        Thread.currentThread().getPriority()));
            });
            thread.setPriority(i);
            thread.start();
        });
    }
}

某次的输出结果

当前线程名称Thread-5,优先级6
当前线程名称Thread-0,优先级1
当前线程名称Thread-1,优先级2
当前线程名称Thread-4,优先级5
当前线程名称Thread-7,优先级8
当前线程名称Thread-2,优先级3
当前线程名称Thread-8,优先级9
当前线程名称Thread-6,优先级7
当前线程名称Thread-3,优先级4

Java提供⼀个线程调度器来监视和控制处于RUNNABLE状态的线程。线程的调度策略采⽤抢占式,优先级⾼的线程⽐优先级低的线程会有更⼤的⼏率优先执⾏。在优先级相同的情况下,按照“先到先得”的原则。每个Java程序都有⼀个默认的主线程,就是通过JVM启动的第⼀个线程main线程。

线程组与线程都有优先级,当线程组内的线程优先级高于线程组的优先级时,系统会自动设置线程的优先级为线程组的优先级。

public class ThreadDemo {
    static int i = 0;

    public static void main(String[] args) throws Exception {
        ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup");
        threadGroup.setMaxPriority(4);
        Thread thread = new Thread(threadGroup, () -> {
            System.out.println("测试线程优先级与线程组优先级");
        });
        thread.setPriority(6);
        System.out.println("线程实际优先级:" + thread.getPriority());
    }
}

输出结果

线程实际优先级:4

三、守护线程

如果某线程是守护线程,那如果所有的⾮守护线程结束,这个守护线程也会⾃动结束。守护线程优先级较低。⼀个线程默认是⾮守护线程,可以通过setDaemon(boolean on)来设置一个线程是否是守护线程。

import java.util.stream.IntStream;

public class ThreadDemo {
    static int i = 0;

    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println("我还活着" + ++i);
            }
        });
        thread.start();
        System.out.println("main方法执行完成");
    }
}

输出结果:

main方法执行完成
我还活着1
我还活着2
......

引入thread线程默认不是守护线程,所以即使main线程结束后,thread线程也会一直循环下去。

我们稍作稍作修改,把thread线程设置成非守护线程。

import java.util.stream.IntStream;

public class ThreadDemo {
    static int i = 0;

    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println("我还活着" + ++i);
            }
        });
        thread.setDaemon(true);
        thread.start();
        //让main线程暂停10ms,防止守护线程未执行main线程就结束的情况
        thread.sleep(10);
        System.out.println("main方法执行完成");
    }
}

某次输出结果

我还活着1
我还活着2
我还活着3
我还活着4
我还活着5
我还活着6
我还活着7
我还活着8
我还活着9
我还活着10
我还活着11
我还活着12
我还活着13
我还活着14
我还活着15
我还活着16
我还活着17
我还活着18
我还活着19
我还活着20
我还活着21
我还活着22
我还活着23
我还活着24
我还活着25
我还活着26
我还活着27
我还活着28
我还活着29
我还活着30
我还活着31
我还活着32
我还活着33
我还活着34
我还活着35
我还活着36
我还活着37
我还活着38
我还活着39
我还活着40
我还活着41
我还活着42
我还活着43
我还活着44
我还活着45
我还活着46
我还活着47
我还活着48
我还活着49
我还活着50
我还活着51
我还活着52
我还活着53
我还活着54
我还活着55
我还活着56
我还活着57
我还活着58
我还活着59
我还活着60
我还活着61
我还活着62
我还活着63
我还活着64
我还活着65
我还活着66
我还活着67
我还活着68
我还活着69
我还活着70
我还活着71
我还活着72
我还活着73
我还活着74
我还活着75
我还活着76
我还活着77
我还活着78
我还活着79
我还活着80
我还活着81
我还活着82
我还活着83
我还活着84
我还活着85
我还活着86
我还活着87
我还活着88
我还活着89
我还活着90
我还活着91
我还活着92
我还活着93
我还活着94
我还活着95
我还活着96
我还活着97
我还活着98
我还活着99
我还活着100
我还活着101
我还活着102
我还活着103
我还活着104
我还活着105
我还活着106
我还活着107
我还活着108
我还活着109
我还活着110
我还活着111
我还活着112
我还活着113
我还活着114
我还活着115
我还活着116
我还活着117
我还活着118
我还活着119
main方法执行完成
我还活着120
我还活着121
我还活着122
我还活着123
我还活着124

可以看到main线程执行完成后,守护线程会自动关闭。

0

评论 (0)

取消