我正在使用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>
我可以在这种情况下使用什么解决方案?
答案 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()来停止一个线程。它的行为可能会变得无法预测,并在未来 如果发生某些意外行为,则很难调试。