各种方法来阻止一个线程 - 这是正确的方法

时间:2011-01-16 13:54:58

标签: java multithreading

我遇到了阻止线程的不同建议。我可以知道,这是正确的方法吗?还是取决于?

使用主题变量 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();
    }
}

3 个答案:

答案 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?? */
    }
}