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和主要指的是什么??
答案 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()?