让建站和SEO变得简单

让不懂建站的用户快速建站,让会建站的提高建站效率!

行业研究

督察线程和无为线程的永诀

发布日期:2024-12-10 04:21    点击次数:128

两种线程

一般情况下,不作念异常讲明成立,默许是用户线程

用户线程(User Thread)

是系统责任线程,它会完成这个身手需要完成的业务操作。

督察线程(Deamon Thread)

是一种比拟异常的线程为其他的线程功绩,在后台默许的完成一些系统功绩,比如垃圾回收线程即是一个典型的例子。

督察线程看成一个功绩线程,莫得功绩对象就莫得必要持续运行了,要是督察线程一都限制了,意味着身手需要完成的任务还是限制了,系统就不错退出了。是以假如系统只剩下督察线程的时辰,Java 造谣契机自动退出。

建立督察线程

线程的 daemon 属性

Thread 的 daemon 默许值为 false 暗示是用户线程

建立督察线程后,要是用户线程实施杀青后,JVM 进度退出。例子如下:

package io.pipi;import java.util.concurrent.TimeUnit;public class Main { public static void main(String[] args) { Thread t1 = new Thread(() -> { System.out.println(Thread.currentThread().getName() + "\t 出手开动化" + (Thread.currentThread().isDaemon() ? "督察线程" : "用户线程")); while (true) { } }, "t1"); t1.setDaemon(true); t1.start(); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(Thread.currentThread().getName() + "\t ---end 干线程"); }}

要是建立 t1.setDaemon(true); 后台线程,当线程实施杀青事后退出

JVM 源码

jvm 中使用 Threads 类追踪正在运行的线程

class Threads: AllStatic { friend class VMStructs; private: static int _number_of_threads; //系统中正在运行的线程 static int _number_of_non_daemon_threads; //非督察线程数 public: static void destroy_vm(); //main 挨次限制后回调}

Threads::destroy_vm 挨次会在 main 挨次限制后调用

void Threads::destroy_vm() { JavaThread* thread = JavaThread::current(); // Wait until we are the last non-daemon thread to execute, or // if we are a daemon then wait until the last non-daemon thread has // executed. bool daemon = java_lang_Thread::is_daemon(thread->threadObj()); int expected = daemon ? 0 : 1; //恭候终末一个非督察线程退出 { MonitorLocker nu(Threads_lock); while (Threads::number_of_non_daemon_threads() > expected) // This wait should make safepoint checks, wait without a timeout. nu.wait(0); } // 实施 shutdown hook // run Java level shutdown hooks thread->invoke_shutdown_hooks(); // 其他资源开释操作}

是以咱们从 jvm 源码中不错看到,督察线程不会影响 jvm 的退出,也考证Thread.java 中的描述。

机器翻译如下(愈加便捷佐证论断):

归来

要是用户线程一都限制意味着身手需要完成的任务还是限制了,督察线程跟着 JVM 一同责任setDaemon(true) 必须在 start() 之前建立,不然会报 java.lang.IllegalThreadStateException 相当