1

我有正在运行的线程,我想停止并稍后在某个时候恢复。我学会了不使用 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 扩展了这个类)。

4

3 回答 3

6

安全地停止和恢复线程的唯一安全方法是在线程主体的相关点添加代码来处理它。(不要使用已弃用的线程停止/暂停/恢复,因为它们根本不安全。)

停止而不恢复相对简单,使用特定于应用程序的标志或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方法的代码中的点处暂停。此外,您还需要注意在线程锁定其他东西或其他东西等待它响应时暂停线程会造成问题。

于 2012-08-08T01:22:54.023 回答
2

Java 1.4 文档解释了原因,并提供了各种已弃用的 Thread 方法的替代方案,包括使用suspend()and来代替。resume()wait()notify()

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

于 2012-08-08T01:11:21.577 回答
0

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

你永远不会直接调用 run() 方法,如果你使用 volatile 变量方法停止线程,线程就会终止。为了启动线程,再次执行 new Thread().start()。

于 2016-03-17T04:59:51.013 回答