我正在把头撞在这里的朋友们的桌子上。这就是我想要完成的。我有一个Main类,它将创建一个新线程。现在,当线程完成工作时,它将执行一些次要清理,并且线程将停止。但是,我在UI上有一个“停止”按钮,当按下该按钮时,应该“进行一些清理,然后杀死线程。问题是,我似乎无法更新我创建的新线程内的任何内容。 。
以下是一些摘要:
主班
runner = new Thread(new Controller1(options));
runner.start();
在上述代码中,我将调用Controller1类,并在构造函数中设置一些“选项”。到目前为止效果很好...
现在,在Controller1类中,这就是我所拥有的...
public volatile static boolean stopped;
public void run() {
while(!stopped ){
System.out.println("In run");
startProxy(proxyPort);
startWebDriver();
driver.get(http);
UIMainJSwing1.updateStartButton();
stopped=true;
}
//Run killAll to stop webdriver and the proxy
killAll();
System.out.println("Thread complete");
}
问题是,在Main类中,我无法调用“ stopped”或将其设置为true。我可以调用Runner.interrupt(),但是问题是,由于线程刚刚死亡,所以我的killAll()函数从未运行过,而WebDriver和Proxy仍在运行。
最佳答案
我会在您的主线程中调用thread.interupt()
并在try
中的循环周围使用finally
/ Runnable
block来确保您的killAll()
方法被调用。
public void run() {
try {
while (!stopped) {
...
}
} finally {
//Run killAll to stop webdriver and the proxy
killAll();
System.out.println("Thread complete");
}
}
最终块将始终被调用。即使线程被中断或引发异常。
加上其他评论:
您提到了
volatile boolean stopped
标志,但是您要在循环结束时立即将其设置为true,所以我确实知道为什么有一个循环。假设该线程未运行并立即调用
killAll()
,则该线程挂在方法之一中的某个位置。当您从主线程调用interrupt()
时,正在等待的任何内容都会抛出InterruptedException
。但是,由于我没有发现任何问题,也许这些方法会将其重新抛出为RuntimeException
?他们至少应该执行以下操作,但这仍然会阻止异常: try {
something.wait();
} catch (InterruptedException e) {
// restore the interrupted condition
Thread.currentThread().interrupt();
}
无论try / finally是确保调用
killAll
的正确方法。