在java多线程编程中,java病没有提供一种比较完全的中断一个线程的方法,而是提供一种基于协作的中断机制,也就是通过中断不能直接终止一个线程,而是被中断的线程自己选择何时处理这个中断,或选择到底处不处理这个中断。每个线程中有一个boolean型标识符,true表示这个线程被要求中断,false表示这个线程暂时不被要求中断或已忽略中断或已处理中断,Thread类的API中有三个用于中断的方法:
public static boolean intercepted():这个方法的作用是看看当前线程是否要求中断,注意,在调用了这个方法之后线程的中断状态就变为false,这个方法可以清除当前线程的中断状态。
public boolean isIntercepted():这个方法的作用是看看当前线程的中断状态,但是不清除线程的中断状态,也就是当线程的中断状态是true时调用之后线程的中断状态还是true。
public void intercept():这个方法的作用是要求一个线程中断,就是把这个线程的中断状态置为true。
下面是一个DEMO,需求是有两个线程,线程1(main方法)和线程2,线程1中断正在运行的线程2:
package test.thread;
public class Test implements Runnable {
public static void main(String[] args) throws Exception {
Thread thread2 = new Thread(new Test(), "线程2");
thread2.start();
System.out.println("线程1开始执行...");
Thread.sleep(3000);
System.out.println("线程1中断线程2...");
thread2.interrupt();//中断线程2
System.out.println("线程2是否中断:"+thread2.isInterrupted());
Thread.sleep(3000);
System.out.println("结束...");
}
@Override
public void run() {
boolean isStop = false;
while(!isStop){
System.out.println("线程2正在运行...");
long time = System.currentTimeMillis();
while(System.currentTimeMillis() - time < 1000){
//这里用时间停顿一下不让控制台打印太多太快
}
if(Thread.currentThread().isInterrupted() == true){//Thread.currentThread().interrupted()是获取当前执行的线程
System.out.println("线程2处理中断...");
isStop = true;
}
}
}
}
运行结果:
线程1开始执行...
线程2正在运行...
线程2正在运行...
线程2正在运行...
线程2正在运行...
线程1中断线程2...
线程2是否中断:true
线程2处理中断...
结束...