我的 Web 应用程序(在 Tomcat 上)提供“动态”逻辑执行功能。
问题是“动态”逻辑可能包含无限循环或持续时间较长的内容。
我的解决方案是超时:在新的守护线程中运行“动态”逻辑并在超时时返回主线程,p代码如下:
ExecutorService executor = Executors.newSingleThreadExecutor(new ThreadFactory(){
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
result.setDaemon(true);
return t;
}});
Future<Object> future = executor.submit(callable/* 'on the fly' callable: it can be infinite loop, the callable is out of my control */);
//Back to main thread
return future.get(timeout, TimeUnit.MILLISECONDS);
但是,尽管 future.get()
返回超时,但守护线程仍在运行。守护进程将终止,直到 Tomcat 停止。
现在我最新的解决方案是创建一个新的Java进程 Runtime.getRuntime().exec("java MyProgram")
。 MyProgram 包含之前显示的 future.get()
。一旦主线程按预期退出,守护进程就会终止。
我来这里是为了寻求更优雅的解决方案来终止 Web 应用程序中的线程。新的 Java 进程很繁重并且无法控制 Web 应用程序。
谢谢!
最佳答案
托管环境中的线程通常是一个坏主意。为什么不使用某种抽象(例如 JMS)在每次有人发送请求时启动后台处理程序?这样您就可以控制 Activity 线程的数量(jms 池大小)
关于java - 终止Web应用程序中的java线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166639/