【发布时间】:2016-03-07 07:13:40
【问题描述】:
Oracle Java SE Docs 建议这样做:
您可以避免使用 Thread.stop,方法是将小程序的停止和运行方法替换为:
private volatile Thread blinker;
public void stop() {
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
有没有办法为class blinker implements Runnable 做同样的事情?
由于您必须使用blinker thisClass = this; 或类似名称,(blinker == thisClass) 不会总是评估为真吗?
或者这段代码就足够了:
class blinker implements Runnable {
boolean stop = false;
@override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// code
// ...
if (stop) { Thread.currentThread().interrupt(); }
// ...
}
}
}
【问题讨论】:
-
我.. 不相信 Oracle 建议这样做。通常的方式是
Thread.interrupt()。不,Runnable没有等价物,只需酌情使用Thread.interrupt()或Future.cancel(true)。 -
@markspace I wouldn't have believed it either
-
我刚刚读到了。这似乎是一个可怕的想法。仅仅因为它是 Oracle 并不意味着他们不能发布经过深思熟虑的代码。我认为这里的主要思想是“不要调用 Thread.stop()”。其他任何东西都是杂物。 OP:使用 Thread.interrupt().
-
所以内部带有
Thread.currentThread().interrupt()的while (!Thread.currentThread().isInterrupted()) { }是完全安全的吗? -
@markspace 在文档中的那个时候,他们没有覆盖被阻塞的线程。该页面的下一部分将介绍中断。这部分解释了停止的替代方法,虽然没有以最好的方式解释,但了解它非常重要。我同意文档写得很糟糕。
标签: java multithreading class runnable