Logo

郎哥编程

线程的中断

2019-12-31 197

线程的中断不是停止线程的运行,而是在线程中设置中断状态,被中断的线程需要响应和处理中断状态。

Thread类定义了三个与中断相关的方法,分别说明如下:

●   void  interrupt()

该方法用于中断当前线程,设置当前线程为中断状态。

●   boolean  interrupted()

该方法用于判断当前线程是否处于中断状态,如果处于中断状态返回true,并清除线程的中断状态标记。

●   boolean  interrupted()

该方法用于判断当前线程是否处于中断状态,如果处于中断状态返回true,该方法不会清除线程的中断状态标记。

案例1:建立ThreadInterrup类,并在run()方法中编写线程功能代码。

在thread包下新建ThreadInterrup类。代码如下:

package thread;
 
/** 
* @ClassName: ThreadInterrup 
* @Description: 多线程操作(线程的中断)案例1
* @author 编程训练营 
* @date  
* 
*/
 
public class ThreadInterrup extends Thread{
 
    /**
    * <p>Title: run</p> 
    * <p>Description: </p>   
    * @see java.lang.Thread#run() 
    */ 
   
    @Override
    public void run() {
       // TODO Auto-generated method stub
       super.run();
       for( int i = 0; i<100; i++ ) {
           // 响应中断
           if (Thread.currentThread().isInterrupted()) {
              System.out.println("ThreadInterrup线程被中断,程序退出。");
              return;
           }
           System.out.println("ThreadInterrup:" + i);
       }
 
    }
 
}

ThreadInterrup类对线程的中断状态进行了响应处理,在for循环中调用Thread类的isInterrupted()方法判断线程是否处于中断状态,如果被设置为中断状态则退出程序。

在thread包下新建ThreadInterrupTest测试类,启动ThreadInterrup线程,并调用interrupt()方法中断线程。代码如下:

package thread;
 
/** 
* @ClassName: ThreadInterrupTest 
* @Description: 多线程操作(线程的中断)案例1  
* @author 编程训练营 
* @date 
* 
*/
 
public class ThreadInterrupTest {
 
    /** 
    * @Title: main 
    * @Description: Java程序入口main方法 
    * @param @param args    参数 
   
    * @return void    返回类型 
    * @throws 
    */
 
    public static void main(String[] args) {
 
       // 实例化MyThread对象
       ThreadInterrup  thread = new ThreadInterrup();
       // 调用Thread类的strat()方法启动线程
       thread.start();
       // 中断当前线程
       thread.interrupt();
    }
 
}

在ThreadInterrupTest类主线程启动子线程后,应用Thread类的interrupt()方法中断子线程,因为子线程内部对线程中断状态进行了响应处理,因此子线程结束运行。

程序执行结果如下图所示:

image.png

当线程内部不响应中断状态时,调用Thread类的interrupt()方法对线程没有任何影响。

修改ThreadInterrup代码,将响应处理中断状态的代码注释掉:

public class ThreadInterrup extends Thread{
 
    /**
    * <p>Title: run</p> 
    * <p>Description: </p>   
    * @see java.lang.Thread#run() 
    */ 
   
    @Override
    public void run() {
       // TODO Auto-generated method stub
       super.run();
       for( int i = 0; i<100; i++ ) {
           // 响应中断
           /*if (Thread.currentThread().isInterrupted()) {
              System.out.println("ThreadInterrup线程被中断,程序退出。");
              return;
           }*/
           System.out.println("ThreadInterrup:" + i);
       }
 
    }
 
}

再次运行ThreadInterrupTest程序,子线程正常运行,没有退出程序。程序执行结果如下图所示:

image.png

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论