我正在把头撞在这里的朋友们的桌子上。这就是我想要完成的。我有一个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的正确方法。

07-27 17:23