java线程中断处理

在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处理中断...
结束...

你可能感兴趣的:(java,多线程)