java - 终止Web应用程序中的java线程

标签 java multithreading jvm

我的 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/

相关文章:

java - Spring 和 Hibernate 2nd level with Ehcache

java - 使用 JNI CallBooleanMethod 的异常信号 11

iphone - 在新线程上设置本地通知?

java - 对单个线程的多个同时访问

mysql - 有没有办法在 MySQL 中的单独线程中运行触发器?

java - 是否可以强制 JVM 检查每个 jar 都必须签名?

java - 我如何在java中添加2个对象

java - 如何在每个测试类都有自己的并行 JVM 的情况下运行 Maven surefire?

java - Concurrent Mark Sweep (CMS) 是停止世界事件吗?

java - 使用 org.apache.commons.exec.DefaultExecutor 执行 shell 命令