gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:18:22 25 4
gpt4 key购买 nike

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

编辑:它是一个计时器,在线程启动时启动,然后可以暂停并再次启动。所以计时器是一个包含 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 或“子”线程中的 Activity ,它只会在您调用 pausePoint 方法的代码点暂停。此外,您还需要注意在线程持有其他对象的锁或其他对象正在等待它响应时暂停线程,以免产生问题。

关于java - 如何在 Java 中安全地停止和恢复线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11856287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com