可能的重复项:
如何在 Java 中启动/停止/重新启动线程?
1.如果在正在运行的线程上调用 start(),则错误2.如果在已停止的线程上调用 start(),则不会发生任何反应。
不支持对同一对象进行重启的原因是什么?
我认为设计师这样做是因为操作系统级别的线程通常以这种方式运行 - 它们被创建,它们可以运行,然后它们被销毁并且操作系统执行清理。因此,Java 设计人员可能希望 Java 中的线程概念接近大多数操作系统中的线程概念。方法start()
和stop()
并不意味着暂停线程(我们有同步),只是为了让它运行并销毁对象。也许名字有点混乱。请注意,stop()
已被弃用,不应使用,因此如果我们消除stop()
,名称start()
不再那么令人困惑。
Thread.run() 方法背后的思想。这个想法是每个线程都有生命周期,如果它过期(完成 run() 方法块),线程就会死。 如果你想停止线程一段时间,然后再次运行它,常见的方法是实现 Runnable 接口(或扩展 Thread 类)并在里面得到一个布尔标志。 这是一个简单的代码:
public class MyThread implements Runnable {
private Thread t;
private boolean isRestarted;
private boolean isInterrupted;
public MyThread() {
t = new Thread(this);
isInterrupted = false;
isRestarted = false;
t.start();
}
public void run() {
//Do somework
while(true) {
if(isInterrupted) break;
if(isRestarted) run();
}
}
public void restart() { isRestarted = true; }
public void interupt() { isInterrupted = true; }
}
现在,当线程未中断时,它将等待重新启动。当您中断它时,它无法再重新启动。