Java 强制停止线程在循环周期内执行

标签 java multithreading

我正在使用 HtmlUnit 开发一个应用程序。大多数使用过 HtmlUnit 的人都知道,当启用 Javascript 时,加载单个页面需要一段时间。

我的应用程序包含停止页面加载的选项,例如完全停止所有加载和操作。

所以我有执行器类:

public class Executer extends Thread {

    private Application app;

    public Executer(Application app) {
        this.app = app;
    }

    @Override
    public void run() {
        for (;;)
            while (app.isRunning()) {
                app.execute();
            }
    }
}

基本上这是我的执行器线程,它每个周期都会调用app.execute()

因此,execute方法会处理很多HtmlUnit命令,例如getPage(),以便htmlunit加载新页面等。

如果用户单击“停止”按钮,然后停止按钮将 isRunning 的 boolean 值更改为 false,则线程显然不会停止在 execute() 方法内执行,因为它不是“尚未执行完毕。

我需要找到一种方法来强制线程执行任何事情。

我发现的一个解决方案是使用 executer.stop() 它基本上停止了线程正在执行的所有内容,但是我听说 .stop 已被弃用,因为它只是停止所有内容并且某些对象可能会被锁定并导致问题。

对于这种情况我可以使用什么解决方案?

最佳答案

基本上你不能。这是有原因的 - 如果线程在其正在执行的任何指令上终止,java 无法确保应用程序状态不会被破坏。

例如:

尝试(输入流= openStream()){ 读取流内容(输入); }

如果 java 在执行 readStreamContent() 期间终止线程,则流将永远不会关闭。

另一个例子:

互斥体.acquire(); 尝试 { 做一点事(); } 最后 { 互斥锁.release(); }

如果我们在doSomething()中终止线程,它永远不会释放互斥体。这可能会使许多线程卡在永远不会被释放的互斥体上。

关于Java 强制停止线程在循环周期内执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705036/

相关文章:

c# - 关于多线程的问题

java - 如何防止 Tomcat6 在 WEB-INF/lib 中预加载 JDBC 驱动程序?

java通讯协议(protocol)

java - Braintree 结账付款失败

multithreading - 使用 akka 进行日志记录。应用程序设计

multithreading - 在NHibernate中同时打开多个 session

multithreading - 有没有一种方法可以检测QT QRunnable对象何时完成?

java - android中将异步方法转为同步方法

java - 我的数据与用户输入和数据库不一样

multithreading - 处理长时间运行的 Hibernate 事务中的死锁