从可运行的类中断中线程? (Java)的

时间:2010-05-08 22:51:01

标签: java multithreading interrupt

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

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(),这样我就不会将状态设置为重置状态。

3 个答案:

答案 0 :(得分:3)

你想简单地调用interrupt() - 这将中断guiThread,而不是调用线程。 E.g。

public void cancel()

{

  guiThread.interrupt();

  // other clean up code here.

}

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

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

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

答案 1 :(得分: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 );

答案 2 :(得分:0)

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

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

public void cancel() {
    if (!isInterrupted()) {
        interrupt();
    }
}