利用interrupt()和isInterrupted()来控制线程的例子
1.线程A执行2秒后结束
public class Study {
public static void main(String[] args) {
Thread A = new Thread(()->{
while(true){
if (Thread.currentThread().isInterrupted()){
break;
}
System.out.println("A say hello");
}
});
A.start();
//2秒后,将A的中断标志设置为True
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
A.interrupt();
},"B").start();
}
}
2.如果一个线程在sleep()、join()、wait()后,执行interrupt()会爆出异常,并且会被置成false,导致程序不能停止。
public class Study {
public static void main(String[] args) {
Thread A = new Thread(()->{
while(true){
if (Thread.currentThread().isInterrupted()){
break;
}
System.out.println("A say hello");
//每隔0.5秒输出
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
A.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
A.interrupt();
},"B").start();
}
}
解决方法:在异常处理添加 interrupt();
public class Study {
public static void main(String[] args) {
Thread A = new Thread(()->{
while(true){
if (Thread.currentThread().isInterrupted()){
break;
}
System.out.println("A say hello");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
});
A.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
A.interrupt();
},"B").start();
}
}