我正在这里对着桌子的朋友们猛击头。这就是我想要完成的。我有一个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。
答案 0 :(得分:1)
我会在您的主要帖子中调用thread.interupt()
并在Runnable
的循环周围使用try
/ finally
block来确保调用killAll()
方法。
public void run() {
try {
while (!stopped) {
...
}
} finally {
//Run killAll to stop webdriver and the proxy
killAll();
System.out.println("Thread complete");
}
}
finally块将始终被调用。即使线程被中断或抛出异常。
结合其他评论:
你提到volatile boolean stopped
标志,但是你在循环结束时立即设置为真,所以我确实知道为什么你有一个循环。
假设线程没有运行并立即调用killAll()
,那么它就会悬挂在其中一个方法中。当您从主线程中调用interrupt()
时,正在等待的任何内容都会抛出InterruptedException
。但是,由于我没有看到任何捕获,可能这些方法重新抛出它作为RuntimeException
?他们至少应该做类似下面的事情,但这仍然阻止了例外:
try {
something.wait();
} catch (InterruptedException e) {
// restore the interrupted condition
Thread.currentThread().interrupt();
}
无论try / finally是确保killAll
被调用的正确方法。
答案 1 :(得分:0)
首先,您应该捕获InterruptedException,以便运行killAll()方法。 只需使用try / finally
即可其次,为什么不能从main方法设置stopped = true?
答案 2 :(得分:0)
如果我理解正确,你就会滥用while(!停止)成语。在你的代码中,你检查它是否没有停止过一次,然后做所有的事情到最后,设置stopped = true并退出。你只是没有机会在它开始后停止执行。当它开始时,停止的字段将永远不会再次被解决,直到它结束。
答案 3 :(得分:0)
首先,丢失while(!stopped)
和stopped=true
部分。
您还需要在线程的每个单独阶段评估stopped
(并记住运行killAll()并重新启用开始按钮)。