在java中停止线程的安全方法

时间:2011-12-27 22:14:47

标签: java multithreading thread-safety

public class thread extends Thread {

    static volatile boolean done = false;// volatile keyword is used            

@Override
public void run() {
    while (!done) {
        for (int i = 1; i < 10; i++) {

            try {
                thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(currentThread());
            System.out.println("1st thread>> " + i);
        }
    }
}

public static void main(String[] args) throws InterruptedException {

    Thread th = new Thread(new thread(),"mythread");
    th.start();
    for (int i = 1; i < 10; i++) {
        thread.sleep(400);
        System.out.println(currentThread());
        System.out.println("2nd thread>> " + i);
        if (i == 4) {
            done = true;// safe way to stop a thread
            break;
        }
    }

   }
  }

我在这里使用volatile静态变量。它是一种安全的方法来停止一个线程 当我打印currentThread()方法时,我得到像Thread [mythread,5,main]的输出 5和主要指的是什么??

2 个答案:

答案 0 :(得分:4)

这是一种停止线程的安全方法,但是没有理由让变量是静态的:你想要停止一个线程,而不是同一个类的所有线程。 此外,还有一种更标准,更不易碎的方法来阻止线程:打断它。

public void run() {
    while (!Thread.currentThread().isInterrupted() {
        ...
    }
}

...

th.interrupt();

这具有额外的优点,即在可中断的IO方法中休眠或等待或阻塞的线程将被InterruptedException唤醒。当发生这样的异常时,这意味着线程应该停止运行,所以你不应该像你那样吞下异常。相反,您应该尽快从run方法返回:

try {
    thread.sleep(200);
} 
catch (InterruptedException e) {
    return;
}

答案 1 :(得分:1)

to toTtring的线程,当您执行System.out.println(currentThread())时调用的是打印出线程名称,优先级和线程组。

我假设您正在尝试中断线程以获得正常完成之外的其他内容,那么为什么不使用Thread.interrupt()和Thread.isInterrupted()?