今晚研究了一下多线程方面的书,有点心得,记录下来。
先来看一下interrupted()方法:判断当前线程是否为中断状态,执行后将状态标志清除为false。下面直接看代码:
public class InterruptThread extends Thread{
@Override
public void run(){
super.run();
for (int i=0; i < 5000; i++){
System.out.println("i = " + (i+1));
}
}
}
下面是运行的类
public class InterruptRun {
public static void main(String[] args) {
try {
InterruptThread threadI = new InterruptThread();
threadI.start();
Thread.sleep(10);
threadI.interrupt();
Thread.currentThread().interrupt();
System.out.println("main:" + Thread.currentThread().getName() + "是否停止1? = " + Thread.interrupted());
System.out.println("main:" + Thread.currentThread().getName() + "是否停止2? = " + Thread.interrupted());
System.out.println(threadI.getName() + "是否停止3? = " + threadI.isInterrupted());
System.out.println(threadI.getName() + "是否停止4? = " + threadI.isInterrupted());
}catch (InterruptedException e){
System.out.println("main catch");
e.printStackTrace();
}
}
}
结果:
...
i = 438
i = 439
main:main是否停止1? = true
main:main是否停止2? = false
Thread-0是否停止3? = true
Thread-0是否停止4? = true
i = 440
i = 441
...
结论:
1. 我们执行的是InterruptRun这个上的main函数,可以看到有一个main线程,main线程调用了另外一个线程Thread-0来执行线程类里的run方法。它们是并行
执行的。
2. 我们使用了interrupt这个方法,然后也输出了Thread-0的中断标志位确实为true,然而run()中的循环还在跑直到结束,说明使用interrupt这个方法并不会让线程立即停下来。
3. mian线程中的标志位为什么会先为true,然后变成false呢?这就是前面说的interrupted()方法会将当前线程中的true置为false。
问题来了,如果我就是想让线程立即停止,需要怎么做?这时候可以加个判断,用抛出异常的方法来让线程停止。
public class InterruptThread extends Thread{
@Override
public void run(){
super.run();
try {
for (int i=0; i < 5000; i++){
if (this.isInterrupted()){
System.out.println("已经是停止状态了,我要退出");
throw new InterruptedException();
}
System.out.println("i = " + (i+1));
}
}catch (InterruptedException e){
System.out.println("进入InterruptThread的catch块");
e.printStackTrace();
}
}
}
这时候看结果:
i = 662
i = 663
main:main是否停止1? = true
已经是停止状态了,我要退出
main:main是否停止2? = false
进入InterruptThread的catch块
Thread-0是否停止3? = true
Thread-0是否停止4? = true
java.lang.InterruptedException
at chapter01.InterruptThread.run(InterruptThread.java:14)
Thread-0线程就会立即停止,并且抛出InterruptedException异常。