2
以下守護豆運行:爲什麼non-daemon線程在jUnit測試中終止?
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;
}
}
}
}
它是守護進程,所以如果單將終止。
因此,下面的非守護豆正在等待他:
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");
}
}
豆類Spring的配置文件是:
<bean id="daemon" class="beans.DaemonBean"/>
<bean id="waitor" class="beans.Waitor1">
<property name="joinable" ref="daemon"/>
</bean>
的問題是:爲什麼會工作,如果從主拼命地跑如果從jUnit測試運行,不工作?
運行的代碼是
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/beans/Waiting1.xml");
}
或
@Test
public void testWaiting1() {
new ClassPathXmlApplicationContext("/beans/Waiting1.xml");
}
在主我看到所有hearbeats情況。在jUnit的情況下,我只看到心跳0,然後顯示消息「Waiting started」,程序終止,就好像沒有人在這裏等待非守護線程一樣。
可能是什麼原因呢?
它以某種特殊方式殺死我的線程,或者只是用'System.exit()'終止JVM? –
@SuzanCioc:它取決於你如何運行你的JUnit測試(IDE,surefire,CI服務器),但基本上它用'System.exit()'殺死JVM。 –