2

我正在尝试在实现可运行接口的类中设置一个方法,该接口将设置该类的中断状态。我希望能够从课堂内部完成它的原因是还有一些我需要处理的其他清理工作,我希望能够通过调用一种方法而不是调用来完成这一切, 例如:

Gui gui = new Gui() // class that implements runnable

Thread guiThread = new Thread(gui, "gui thread");

guiThread.start()

...

...

guiThread.interrupt();

gui.cancel();

目前我的取消代码看起来像这样,但是它没有正确设置这个线程的中断状态。

public void cancel()

{

  Thread.currentThread().interrupt();

  // other clean up code here.

}

关于是否/如何让这个工作的任何建议?

谢谢。

编辑:当我尝试取消工作时,我注释掉了 guiThread.interrupt(),这样我不只是设置状态来重置状态。

4

3 回答 3

3

您只想调用 interrupt() - 这将中断 guiThread,而不是调用线程。例如

public void cancel()

{

  guiThread.interrupt();

  // other clean up code here.

}

但是,您确定要在调用线程上运行清理代码吗?通常最好让线程本身进行自己的清理。你不知道线程何时被中断并准备好被清理。如果线程在中断时退出,您可以在 interrupt() 之后添加一个 join(),但这通常不如简单地让线程本身进行清理。(稍后,您甚至可能没有单独的线程来执行这些任务,而是使用线程池。将清理与任务一起放入将使这更容易管理。)

最后,请注意您的线程不会自动中断并停止它正在执行的操作——您需要调用检查中断状态的方法,例如 Object.wait()、Thread.sleep() 等,或者您可以显式检查通过 Thread.isInterrupted() 的中断状态。

编辑:它认为 cancel() 在 guiThread 上。不是,所以我改变了中断调用。

于 2010-05-08T23:13:59.123 回答
2

如果你想在里面做所有事情cancel,只需向它添加一个Thread参数并将一个 guiThread 传递给它。

void cancel ( final Thread guiThread )
{
  guiThread.interrupt( );

  guiThread.join( );

  // other cleanup code
  ...
}

来电代码

Gui gui = new Gui() // class that implements runnable

Thread guiThread = new Thread(gui, "gui thread");

guiThread.start()

...

...

gui.cancel( guiThread );
于 2010-05-08T23:51:23.793 回答
0

guiThread.interrupt(); 应该可以正常工作,但是如果你想从内部类方法中断你的线程,你应该这样做:

public void cancel() {
    if (isAlive()) {
        this.interrupt();
    }
}

或者

public void cancel() {
    if (!isInterrupted()) {
        interrupt();
    }
}
于 2017-03-27T12:01:41.770 回答