【问题标题】:Multithreading Parent and Child thread execution in JavaJava中的多线程父子线程执行
【发布时间】:2020-09-14 16:30:44
【问题描述】:

这是一个关于 Java 多线程的初学者问题。

根据我的理解,当创建多个(用户)线程来运行程序或应用程序时,没有父线程和子线程的概念。它们都是独立的用户线程。

所以,如果主线程完成执行,那么另一个线程(Thread2)仍将继续执行,因为它不会被 JVM 杀死,直到 Thread2 的执行线程完成(https://docs.oracle.com/javase/6/docs/api/java/lang/Thread.htmlhttps://stackoverflow.com/a/9651919/6700081

那为什么当主线程在下面的代码中退出时,我没有看到来自 Thread2 打印的 .log() 的日志:

    @Test
    public void parentMainThreadAndChildThreadTest_WithSpringWebFlux() throws InterruptedException {
        Flux<Long> infiniteFlux = Flux.interval(Duration.ofMillis(100));
        infiniteFlux.subscribe((element) -> System.out.println("Value is:::" +element));
        Thread.sleep(3000); //Main thread sleeps for 3 seconds
    }

我看到如果我通过让主线程进入睡眠状态来增加主线程的生命,那么我可以看到系统输出语句。但是为什么Thread2还在异步运行,但主线程结束后却不显示呢?

测试方法是由主线程的执行线程执行的,那么在这种情况下,主线程完成后Thread2会发生什么?

【问题讨论】:

标签: java multithreading spring-webflux


【解决方案1】:

如果主线程完成执行,那么另一个线程(Thread2)仍将继续执行

这仅适用于普通线程。线程池的线程通常配置为守护线程,当所有正常线程完成时强制停止。

在你的情况下,

(element) -> System.out.println("Value is:::" +element)

在从反应器线程池中取出的守护线程上执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多