如何在不使用弃用方法的情况下中断和恢复线程?

时间:2014-12-10 19:55:03

标签: java multithreading

我正在尝试进入线程并对如何暂停/停止/恢复线程进行了一些研究,但由于.stop,.resume等方法被弃用,我目前还不知道该怎么做。

我发现.Interrupt,但在中断后无法获得有关如何恢复它的任何有用信息。

到目前为止,我正在使用我自己创建的解决方法,其中包括向其添加状态变量,以及每次迭代检查状态。但我不认为这是一个很好的解决方案,它可能在一个小规模的代码中工作,但它不是大代码的选择。

这就是我现在的代码:

public class sleep implements Runnable
{     
private int wakeup=0;
public void setwakeup(int wakeupstate)
{
    wakeup=wakeupstate;
}

public void run()
{       

  while(wakeup==0)
  {
    //Code to be done in every Iteration
  }

 }

}

我会使用setwakeup方法来控制线程,但是从我启动它的那一刻起它仍然会运行。

有没有办法暂停并恢复它?正如我所说,我只找到了.Interrupted方法,我不认为这是要走的路,我很不确定如果在处理循环中的代码时线程被中断会发生什么。我的猜测是会抛出很多例外。

那么,我怎样才能安全地暂停和恢复一个帖子?

2 个答案:

答案 0 :(得分:3)

安全停止和恢复线程的唯一安全方法是在线程正文中的相关点添加代码来处理它。 使用特定于应用程序的标志或Thread.interrupt()机制,不使用恢复进行停止相对简单。后者可能更好,因为Java的一些同步和IO API都是中断感知的。但是,您确实遇到了许多现有库不能识别中断,或者没有正确处理InterruptedException的问题。

停止恢复更加棘手。您需要创建自己的类,如下所示:

public class PauseControl {
    private boolean needToPause;

    public synchronized void pausePoint() {
        while (needToPause) {
            wait();
        }
    }

    public synchronized void pause() {
        needToPause = true;
    }

    public synchronized void unpause() {
        needToPause = false;
        this.notifyAll();
    }
}

并在整个线程代码的相关点添加对myPauseControl.pausePoint()的调用。请注意,这不允许您暂停IO或“子”线程中的活动,并且它只会在您调用pausePoint方法的代码中暂停。此外,您需要注意通过暂停线程来保持创建问题,同时保持线程锁定其他内容,或者等待其他东西等待响应。

答案 1 :(得分:0)

对于"恢复"并不意味着什么。中断后。

t.interrupt()方法几乎除了设置线程"中断"旗。 "中断"的含义完全取决于应用程序。

几乎什么都没有,除了它会导致某些方法调用等待一件事或另一件事件因InterruptedException而中止。中断被认为意味着发生了一些重要的事情,并且应用程序应该对它进行一些操作 now ,而不是在此Thread.sleep()完成之后,或者不是在t.wait()之后呼叫返回。

如果您正在编写库例程,那么只有一种合理的方法可以处理中断:中止您可能处于中间的任何事务,清理需要清理的任何内容以便离开库对象处于安全状态,然后将InterruptedException向上传播到调用者。让来电者决定该怎么做。

如果您正在编写顶级应用程序代码,那么您可以将中断解释为您想要的任何内容:它可能意味着关闭,这可能意味着中止您正在处理的命令和提示我换一个新的,或者它可能意味着改变屏幕的背景颜色,或者......任何东西。


强制线程停止是一个坏主意。强制线程暂停(在调试环境之外)是一个坏主意。 强制线程执行任何事情是一个坏主意。

而不是强迫你的线程做事,你应该要求他们做事。线程应该合作

如果要暂停某个线程,则设置一个标志,并写入该线程以定期检查该标志的值,并在设置该标志时暂停。等