调用stop的替代方法是使用中断来向线程发出信号,希望它完成它的工作。 (这假设你想要停止的线程是很好的行为,如果它忽略了InterruptedExceptions,在它们被抛出后立即吃掉它们,并且不检查中断的状态,那么你回到使用stop()。)
这是我写的一个代码,作为一个线程问题here的答案,这是一个线程中断如何工作的例子:
public class HelloWorld {
public static void main(String[] args) throws Exception {
Thread thread = new Thread(new Runnable() {
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
Thread.sleep(5000);
System.out.println("Hello World!");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
thread.start();
System.out.println("press enter to quit");
System.in.read();
thread.interrupt();
}
}
有些事情要注意:
>中断导致sleep()和wait()立即抛出,否则你被卡住等待睡眠时间通过。
>请注意,不需要单独的布尔标志。
>正在停止的线程通过检查中断的状态并捕获while循环之外的InterruptedExceptions(使用它来退出循环)进行协作。中断是一个可以使用流控制的例外的地方,这就是它的整体。
>在catch块中当前线程上设置中断在技术上是最佳实践,但对于该示例来说是过度的,因为没有其他需要中断标志设置的内容。
关于发布代码的一些意见:
>发布的示例是不完整的,但是引用一个实例变量中的当前线程似乎是一个坏主意。它将初始化为创建对象的任何线程,而不是执行run方法的线程。如果在多个线程上执行相同的Runnable实例,则实例变量大部分时间不会反映正确的线程。>检查线程是否存在必然总是导致true(除非currentThread实例变量引用错误的线程有一个错误),线程#isAlive只有在线程执行完成后才为false, t只是因为它被中断而返回false。>调用线程#中断将导致清除中断标志,这在这里没有任何意义,特别是因为返回值被丢弃。调用Thread#中断的一点是测试中断标志的状态,然后清除它,这是抛出InterruptedException的东西所使用的方便方法。