gpt4 book ai didi

java - Spring - 如何杀死无限循环

转载 作者:行者123 更新时间:2023-11-28 23:13:41 26 4
gpt4 key购买 nike

在我的 Spring 应用程序中,有一个用于执行某些任务的调度程序。 Scheduled annotation 没有在那里使用,因为 schedule 非常复杂 - 它是动态的并且它使用了数据库中的一些数据。使用了带有线程 hibernate 的简单无限循环。并且 sleep 间隔根据一些规则改变。也许所有这些都可以通过 Scheduled 注解来完成,但问题不在于此。

下面是一个简单的例子:

@Service
public class SomeService {

@PostConstruct
void init() {

new Thread(() -> {

while (true) {
System.out.println(new Date());
try {
Thread.sleep(1000);
} catch (Exception ex) {
System.out.println("end");
return;
}
}

}).start();
}
}

代码工作正常,但在终止新线程时遇到了一些问题。当我从 Tomcat 停止应用程序时,这个新线程继续运行。所以在 Tomcat 管理页面上我看到应用程序已停止,但在 Tomcat 日志文件中我仍然看到线程的输出。

那么问题是什么?我应该如何更改代码以便在应用程序停止时终止线程?

最佳答案

您是否尝试实现一个 @PreDestroy 方法,该方法将在 WebApplicationContext 关闭之前调用以更改循环中使用的 boolean 标志?虽然即使在应用程序停止时您的对象也没有被丢弃似乎很奇怪......

class Scheduler {

private AtomicBoolean booleanFlag = new AtomicBoolean(true);

@PostConstruct
private void init() {
new Thread(() -> {
while (booleanFlag.get()) {
// do whatever you want
}
}).start();
}

@PreDestroy
private void destroy() {
booleanFlag.set(false);
}
}

关于java - Spring - 如何杀死无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522487/

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