春天-如何杀死无尽的循环

时间:2018-11-28 15:07:51

标签: java spring multithreading tomcat kill

在我的Spring应用程序中,有一个用于执行某些任务的调度程序。在这里不使用计划注释,因为计划非常复杂-它是动态的,并且使用了数据库中的一些数据。因此使用了带有线程休眠的简单无尽循环。并且睡眠间隔根据一些规则而改变。也许所有这些都可以通过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日志文件中,我仍然看到该线程的输出。

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

1 个答案:

答案 0 :(得分:0)

您是否尝试实现一种@PreDestroy方法,该方法将在关闭WebApplicationContext之前被调用以更改循环中使用的布尔标志?尽管即使停止应用程序也不会丢弃对象,这似乎很奇怪。

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);
    }
}