在Web应用程序中终止java线程

时间:2014-03-04 08:32:02

标签: java multithreading jvm

我的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应用程序。

谢谢!

1 个答案:

答案 0 :(得分:2)

在托管环境中进行线程通常是个坏主意。为什么不在每次有人发送请求时都使用像JMS这样的抽象来启动后台处理程序?这样你可以控制活动线程的数量(jms池大小)