[英]How to stop and resume thread safely in 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()方法,并且如果使用易失变量方法停止线程,则该线程将具有TERMINATED。 为了启动线程,再次执行新的Thread()。start()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.