我的Web应用程序(在Tomcat上)提供“即时”逻辑执行功能 问题是“在运行中”逻辑可能包含无限循环,或持续时间很长。
我的解决方案是超时:在新的守护程序线程中运行“on the run”逻辑并在超时时返回主线程,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应用程序。
谢谢!
答案 0 :(得分:2)
在托管环境中进行线程通常是个坏主意。为什么不在每次有人发送请求时都使用像JMS这样的抽象来启动后台处理程序?这样你可以控制活动线程的数量(jms池大小)