【问题标题】:Terminate java thread in web application在 Web 应用程序中终止 java 线程
【发布时间】:2014-03-04 08:32:01
【问题描述】:

我的 Web 应用程序(在 Tomcat 上)提供“动态”逻辑执行功能。
问题是“on the fly”逻辑可能包含无限循环,或者持续时间很长的东西。

我的解决方案是超时:在一个新的守护线程中运行“on the fly”逻辑,超时返回主线程,p-code如下:

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

谢谢!

【问题讨论】:

    标签: java multithreading jvm


    【解决方案1】:

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

    【讨论】:

    • 是的。但是如果没有机会终止正在运行的线程,线程池就会满了。
    • Thread.stop() 方法不安全,因此不推荐使用。如果被停止的线程正在修改公共数据,则该公共数据将保持不一致的状态。
    • 投票。将线程移出 Web 容器是不可避免的。
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多