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

时间:2014-09-06 21:43:18

标签: java multithreading

我正在使用HtmlUnit处理应用程序。由于大多数使用过HtmlUnit的人都知道,当你启用了Javascript时,加载一个页面需要一段时间。

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

所以我有Executer类:

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的false,则线程显然不会在execute()方法内执行,因为它不是已完成执行。

我需要找到一种方法来强制线程执行ANYTHING。

我找到的解决方案是使用executer.stop()它基本上停止了线程正在执行的所有内容,但是我不赞成使用.stop因为它只是停止所有内容而某些对象可能会被锁定并导致问题。< / p>

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

3 个答案:

答案 0 :(得分:1)

如果您不想使用Thread.Stop(),则必须execute()中实施特殊代码 - 也是检查app.isRunning() - 州 我担心没有其他方法可以阻止execute() - 方法。

编辑:
如上所述,应谨慎使用thread.stop();

答案 1 :(得分:0)

基本上你不能。并且有理由 - 如果线程在正在执行的任何指令上终止,则java无法确保应用程序状态不会被破坏。

例如:

try(InputStream in = openStream()){ readStreamContent(in); }

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

另一个例子:

mutex.acquire(); try { doSomething(); } finally { mutex.release(); }

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

答案 2 :(得分:0)

通过调用

,只需将isInterrupted个实例的Executor标记设置为true
executor.interrupt()

这是停止线程最安全的方法。当您加载页面时,线程不会主动等待,因此如果在等待服务器响应时它被中断,执行程序将停止 几乎就是马上。由于Application.isRunning()标志完全相同,因此您无需isInterrupted

修改 不要使用Thread.stop()来停止一个线程。它的行为可能会变得无法预测,并在未来 如果发生某些意外行为,则很难调试。