用户线程和守护线程(附代码示例)

概念

Java线程分为守护线程和用户线程

守护线程,是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程

用户线程,是系统的工作线程,它会完成这个程序需要完成的业务操作

当程序中所有用户线程执行完毕之后,不管守护线程是否结束,系统都会自动退出。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。

所以当系统只剩下守护线程的时候,Java虚拟机会自动退出

代码示例

  开启一个线程a, 默认为用户线程,内部通过while循环使其无法结束。

  当主线程(main)结束后,线程a仍然无法结束。

public class Daemon {
    public static void main(String[] args) {
        Thread a =  new Thread(()->{
            System.out.println(Thread.currentThread().getName()+" come in \t"+
                    (Thread.currentThread().isDaemon() ? "守护线程" : "用户线程"));
            while (true){

            }
        },"a");


        a.start();

        //暂停几秒线程
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println(Thread.currentThread().getName()+"\t"+"---task is over");
    }
}

线程的daemon属性为true表示是守护线程,false(默认)表示是用户线程

设置daemon为ture,使得线程a为守护线程,此时当主线程(main)结束后,a也立即结束。

设置守护线程,需要在start()方法之前进行(否则会报错java.lang.IllegalThreadStateException)

public class Daemon {
    public static void main(String[] args) {

        Thread a =  new Thread(()->{
            System.out.println(Thread.currentThread().getName()+" come in \t"+
                    (Thread.currentThread().isDaemon() ? "守护线程" : "用户线程"));
            while (true){

            }
        },"a");

        a.setDaemon(true);
        a.start();
        //暂停几秒线程
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"\t"+"---task is over");
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 PyQt5 中,可以使用 Python 的多线程模块 `threading` 来创建线程,并通过设置线程的 `daemon` 属性来实现线程的守护。 当一个线程被设置为守护线程时,主线程退出时,守护线程会被自动终止,而不管它是否执行完毕。 下面是示例代码,演示了如何在 PyQt5 中创建一个守护线程: ```python import sys import time import threading from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel class WorkerThread(threading.Thread): def __init__(self): super().__init__() self.daemon = True # 设置线程为守护线程 def run(self): # 执行耗时操作 time.sleep(5) print("Worker thread finished") class MainWindow(QMainWindow): def __init__(self): super().__init__() label = QLabel("Main Window", self) label.setGeometry(100, 100, 200, 30) worker_thread = WorkerThread() worker_thread.start() app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在上面的代码中,我们创建了一个继承自 `threading.Thread` 的 `WorkerThread` 类,并在 `__init__` 方法中将 `self.daemon` 设置为 `True`,表示该线程为守护线程。然后在 `run` 方法中执行耗时操作。 在主窗口类 `MainWindow` 的构造函数中,我们创建了一个 `WorkerThread` 实例,并调用 `start` 方法启动守护线程。 需要注意的是,守护线程在执行完毕前,主线程不会退出。所以在上面的例子中,主窗口会一直显示,直到守护线程执行完毕后,才会退出程序。 希望这个例子能帮助到你!如果还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值