Java - 无法停止从主类运行

时间:2012-03-20 15:43:13

标签: java multithreading runnable

我正在这里对着桌子的朋友们猛击头。这就是我想要完成的。我有一个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。

4 个答案:

答案 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()并重新启用开始按钮)。