如何在Java中安全地停止和恢复线程?

我正在运行线程,我想停止并稍后恢复。 我学会了不要使用stop()等,因为它们已被弃用,并得到了下面的代码,似乎停止线程成功。 它只是退出运行方法。 现在,我该如何重新启动它? 如果我调用start()方法,它说线程仍在运行,那么直接调用run()会在这种情况下执行吗? 会导致任何问题吗? 顺便说一下,这是Android应用程序,如果这有什么区别。

private volatile stopThread;

public void stopButton() {
    // this is called when button is clicked
    // and thread is already started and running
    stopThread= true;
}

public void run() {

    while (!stopThread) {
        // do something here
    }

    stopThread=false;
}

编辑:它是一个计时器,当线程启动时启动,然后可以暂停并重新启动。 所以timer是一个包含Thread对象的类(我已经用SurfaceView扩展了这个类)。


安全地停止和恢复线程的唯一安全方法是在线程体内的相关点添加代码来处理它。 (请勿使用弃用的线程停止/暂停/继续,因为它们基本上是不安全的。)

停止不恢复相对简单,使用特定于应用程序的标志或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方法的代码中的点处暂停。 此外,您还需要注意通过暂停线程,同时锁定其他某些内容,或者在其他内容等待响应时创建问题。


Java 1.4文档解释了为什么,并通过使用wait()notify()来替代各种弃用的Thread方法,包括suspend()resume()

寻找标题我应该用什么来代替Thread.suspend和Thread.resume? 大约在页面的一半。


Thread类的stop()方法已弃用且不安全,因为停止Thread会导致它解锁所有已锁定的监视器。 这具有破坏性后果,因为处于不一致状态的任何对象(以前由监视器保护)可能现在可以由处于不一致状态的其他线程查看。 这种行为可能微妙且难以检测。

你从不直接调用run()方法,如果你使用volatile变量来停止线程,线程将会终止。 为了启动Thread,再次执行新的Thread()。start()。

链接地址: http://www.djcxy.com/p/92153.html

上一篇: How to stop and resume thread safely in Java?

下一篇: How to wait for variable?