import java.util.concurrent.TimeUnit;
public class TestInterrupted {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new TestRunner());
Thread t2 = new Thread(new TestRunner2());
//t1.setDaemon(true);
t1.start();
t2.start();
TimeUnit.SECONDS.sleep(3);
t1.interrupt();
t2.interrupt();
System.out.println("t1.isInterrupted(): "+ t1.isInterrupted());
System.out.println("t2.isInterrupted(): "+ t2.isInterrupted());
}
static class TestRunner implements Runnable{
@Override
public void run() {
while(!Thread.interrupted()){
}
}
}
static class TestRunner2 implements Runnable{
@Override
public void run() {
while(true){
}
}
}
}
输出:
t1.isInterrupted(): false
t2.isInterrupted(): true
并且程序不会停止。TestRunner2仍然在运行
Thread.interrupted()会清楚中断状态位。
import java.util.concurrent.TimeUnit;
public class TestInterrupted {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new TestRunner());
Thread t2 = new Thread(new TestRunner2());
//t1.setDaemon(true);
t1.start();
t2.start();
TimeUnit.SECONDS.sleep(3);
t1.interrupt();
t2.interrupt();
System.out.println("t1.isAlive(): "+ t1.isAlive());
System.out.println("t2.isAlive(): "+ t2.isAlive());
System.out.println("t1.isInterrupted(): "+ t1.isInterrupted());
System.out.println("t2.isInterrupted(): "+ t2.isInterrupted());
}
static class TestRunner implements Runnable{
@Override
public void run() {
while(!Thread.interrupted()){
}
}
}
static class TestRunner2 implements Runnable{
boolean flag = true;
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
//System.out.println(Thread.currentThread().isInterrupted());
}
}
}
}
输出:
t1.isAlive(): false
t2.isAlive(): false
t1.isInterrupted(): false
t2.isInterrupted(): false
我的理解: 线程执行结束后,中断标志位也就被清除了。
import java.util.concurrent.TimeUnit;
public class TestInterrupted2 {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new TestRunner());
Thread t2 = new Thread(new TestRunner2());
//t1.setDaemon(true);
t1.start();
t2.start();
TimeUnit.SECONDS.sleep(3);
t1.interrupt();
t2.interrupt();
System.out.println("t1.isAlive(): "+ t1.isAlive());
System.out.println("t2.isAlive(): "+ t2.isAlive());
TimeUnit.SECONDS.sleep(3);
System.out.println("t1.isInterrupted(): "+ t1.isInterrupted());
System.out.println("t2.isInterrupted(): "+ t2.isInterrupted());
}
static class TestRunner implements Runnable{
@Override
public void run() {
while(true){
}
}
}
static class TestRunner2 implements Runnable{
boolean flag = true;
@Override
public void run() {
while(true){
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
输出:
t1.isAlive(): true
t2.isAlive(): true
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at TestInterrupted2$TestRunner2.run(TestInterrupted2.java:33)
at java.lang.Thread.run(Thread.java:745)
t1.isInterrupted(): true
t2.isInterrupted(): false
声明抛出InterruptedException的方法会在抛出InterruptedException之前,清除中断状态位。