我正在使用 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/