gpt4 book ai didi

java - 为什么在 jUnit 测试中非守护线程会终止?

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:25 25 4
gpt4 key购买 nike

以下守护进程 bean 正在运行:

public class DaemonBean extends Thread {

private final static Logger log = LoggerFactory.getLogger(DaemonBean.class);

{
setDaemon(true);
start();
}

@Override
public void run() {

for(int i=0; i<10 && !isInterrupted(); ++i) {
log.info("Hearbeat {}", i);
try {
sleep(1000);
} catch (InterruptedException e) {
return;
}
}

}
}

它是守护进程,因此如果是单例则会终止。

因此,以下非守护程序 bean 正在等待他:

public class Waitor1 extends Thread {

private final static Logger log = LoggerFactory.getLogger(Waitor1.class);

private Thread joinable;

{
setDaemon(false);
setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

@Override
public void uncaughtException(Thread t, Throwable e) {
log.error("Error in thread", e);
}
});
}

public Thread getJoinable() {
return joinable;
}

public void setJoinable(Thread value) {
this.joinable = value;
if( this.joinable != null ) {
start();
}
}

@Override
public void run() {

log.info("Waiting started");

try {
joinable.join();
} catch (InterruptedException e) {
log.info("Thread interrupted");
return;
}

log.info("Waiting ended");

}

}

Bean 的 Spring 配置是:

<bean id="daemon" class="beans.DaemonBean"/>

<bean id="waitor" class="beans.Waitor1">
<property name="joinable" ref="daemon"/>
</bean>

问题是:为什么从 main 运行它可以工作,而从 jUnit test 运行则不起作用?

运行代码是

 public static void main(String[] args) {
new ClassPathXmlApplicationContext("/beans/Waiting1.xml");
}

@Test
public void testWaiting1() {
new ClassPathXmlApplicationContext("/beans/Waiting1.xml");
}

如果是 main,我会看到所有心跳。在 jUnit 的情况下,我只看到心跳 0,然后消息“等待开始”,并且程序终止,就好像没有人在这里等待非守护线程一样。

这可能是什么原因?

最佳答案

当您从 main 运行代码时,它会创建两个 bean,从而创建两个线程 - 守护进程和非守护进程。只要非守护线程正在运行,您的应用程序就不会退出。所以它有效。

从 JUnit 运行时会有所不同。一旦 JUnit 测试方法完成(并且在 Spring 上下文启动后立即完成),JUnit 就假定您的测试已完成。因此它会杀死所有线程,基本上是整个 JVM。

请记住,您的 Waitor1 bean 会生成 JUnit 不关心的后台线程。一旦您离开 @Test 方法,JUnit 就会停止一切。

关于java - 为什么在 jUnit 测试中非守护线程会终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57648821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com