线程的生命周期之“守护“线程

"守护"线程

有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务,这种线程被称为"守护线程",它的特点是:如果所有的前台线程都死亡,后台线程会自动死亡。可以使用 setDaemon() 方法将一个线程设置为守护线程。

下面是一个使用守护线程的 Java 多线程代码示例:

复制代码
public class MyThread extends Thread {
    
    public MyThread() {
        setDaemon(true); // 将线程设置为守护线程
    }
    
    @Override
    public void run() {
        while (true) {
            System.out.println("守护线程正在运行中...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        
        System.out.println("主线程正在运行中...");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程运行完毕");
    }
} 

输出结果:
主线程正在运行中...
守护线程正在运行中...
守护线程正在运行中...
守护线程正在运行中...
守护线程正在运行中...
守护线程正在运行中...
主线程运行完毕

线程优先级

每个线程执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。每个线程默认的优先级都与创建它的父线程的优先级相同,在默认情况下,main 线程具有普通优先级,由main 线程创建的子线程也具有普通优先级。

Thread 类提供了 setPriority(int newPriority) 、getPriority () 方法来设置和返回指定线程的优先级,其中setPriority() 方法的参数可以是一个整数,范围是1~10之间,也可以使用 Thread 类的 MAX_PRIORITY(10)、MIN_PRIORITY(1)和NORM_PRIORITY(5)这三个静态常量。

以下是一个简单的 Java 多线程代码示例,使用 setPriority () 方法设置线程优先级:

复制代码
public class ThreadExample implements Runnable {
    @Override
    public void run() {
        for(int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + " is running");
        }
    }

    public static void main(String[] args) {
        ThreadExample threadExample = new ThreadExample();

        Thread thread1 = new Thread(threadExample, "Thread 1");
        Thread thread2 = new Thread(threadExample, "Thread 2");

        // 设置线程1的优先级为最高
        thread1.setPriority(Thread.MAX_PRIORITY);

        // 设置线程2的优先级为最低
        thread2.setPriority(Thread.MIN_PRIORITY);

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

在上面的示例中,我们创建了一个 Runnable 对象 ThreadExample ,并创建了两个 Thread 对象 thread 1 和thread 2 来运行它。我们使用 setPriority() 方法将线程1的优先级设置为最高( Thread.MAX_PRIORITY ),将线程 2 的优先级设置为最低 ( Thread.MIN_PRIORITY )。

然后,我们启动这两个线程并运行它们。由于线程 1 的优先级高于线程 2 ,线程 1 将在大多数情况下先运行。

相关推荐
1024奇点9 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch9 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
天河归来10 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL10 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing0311 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by2099911 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河11 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮12 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻12 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble12 小时前
C++ 用互斥锁实现读写锁
开发语言·c++