我遇到了阻止线程的不同建议。我可以知道,这是正确的方法吗?还是取决于?
使用主题变量 http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
private volatile Thread blinker;
public void stop() {
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
使用布尔标志
private volatile boolean flag;
public void stop() {
flag = false;
}
public void run() {
while (flag) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
将线程变量与中断一起使用
private volatile Thread blinker;
public void stop() {
blinker.interrupt();
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (!thisThread.isInterrupted() && blinker == thisThread) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
答案 0 :(得分:6)
这些都不是“正确的”方式,它们都是有效的。你使用哪一个取决于你的情况,哪一个最适合你。
只要您不使用Thread.stop()
,并且整理线程(连接,临时文件等)所剩下的任何资源,那么你如何处理它并不重要。
答案 1 :(得分:2)
我总是使用布尔标志 - 它是最简单的。
它对于评论者来说非常简短易懂,但它有一个你不能打断睡眠呼叫的手法。您应该只将中断变量用于时间要求严格的线程停止。而且,像斯卡弗曼所说 - 不要使用Thread.stop()
!
答案 2 :(得分:0)
这个怎么样?
class Tester {
public static void main() {
Try t = new Try();
Thread.sleep(10); //wait for 10 milliseconds
t.interrupt(); // 'interrupt' i.e stop the thread
}
}
public class Try extends Thread {
@override
public void interrupt() {
//perform all cleanup code here
this.stop();
/*stop() is unsafe .but if we peform all cleanup code above it should be okay ???. since thread is calling stop itself?? */
}
}