java线程停止interrupt

本文介绍Java中线程中断的实现方法,通过示例代码演示如何使用interrupt方法优雅地停止线程,避免直接使用已废弃的stop方法带来的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:

线程在运行过程中可能需要根据条件判断进行停止,从api上开是可以使用stop方法强制终止线程,但是官方不推荐这个方法,这个是作废过期的方法,因为如果强制让线程停止则有可能使一些清理性的工作得不到完成,同时对锁定的对象进行了“解锁”,有可能导致数据得不到同步处理,从而数据出现问题。


在java中其实可以使用多种方式去终止,比如:

1、使用退出标志,使线程正常退出,也就是说设置个变量,当满足变量的时候就完成,也就是相当于run方法完成后线程终止;

2、使用interrupt方法中断线程;


主要记录下interrupt方法停止线程,代码很简单,具体代码如下:

[html]  view plain  copy
 print ?
  1. public class StopTest extends Thread {  
  2.   
  3.     public static void main(String[] args) {  
  4.         try {  
  5.             //开启线程  
  6.             StopTest thread = new StopTest();  
  7.             thread.start();  
  8.             Thread.sleep(100);  
  9.             //设置线程停止状态  
  10.             thread.interrupt();  
  11.             System.out.println("是否停止了,"+thread.isInterrupted());  
  12.         } catch (Exception e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.   
  16.     }  
  17.   
  18.     @Override  
  19.     public void run() {  
  20.         // TODO Auto-generated method stub  
  21.         for (int i = 0; i < 100000; i++) {  
  22.             System.out.println("i=" + i);  
  23.             //根据线程状态来停止线程业务  
  24.             if (this.isInterrupted()) {  
  25.                 System.out.println("当前线程:" + this.getName() + "停止了!");  
  26.                 break;  
  27.             }  
  28.         }  
  29.         System.out.println("end!!!");  
  30.     }  
  31. }  

运行输出:

i=15313
i=15314
i=15315
是否停止了,true
当前线程:Thread-0停止了!
end!!!

以上代码通过判断线程状态interrupted()方法来停止线程,比起直接用stop来停止的话,好了许多!
### Java 中 `Thread.interrupt()` 方法的使用说明 `Thread.interrupt()` 是 Java线程编程中的一个重要方法,用于请求中断某个线程的操作。它通过设置目标线程的中断状态来通知该线程停止其正在执行的任务[^1]。 #### 1. 设置中断标志 当调用 `thread.interrupt()` 时,如果目标线程处于运行状态,则会将其内部的中断标志位设置为 true。此时,可以通过 `Thread.currentThread().isInterrupted()` 或者 `Thread.isInterrupted()` 来检测此标志的状态[^2]。 #### 2. 阻塞状态下抛出异常 如果目标线程正处于阻塞状态(例如等待锁、休眠或者 I/O 操作),则调用 `interrupt()` 不仅会设置中断标志,还会立即终止这些阻塞操作,并抛出 `InterruptedException` 异常[^4]。需要注意的是,在这种情况下,中断标志会被自动重置为 false[^5]。 以下是具体的代码示例: ```java public class InterruptExample { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { for (int i = 0; i < Integer.MAX_VALUE; i++) { if (Thread.currentThread().isInterrupted()) { System.out.println("Thread interrupted, exiting..."); break; } try { Thread.sleep(500); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 重新设置中断状态 System.out.println("Thread interrupted during sleep"); } System.out.println("Iteration: " + i); } }); thread.start(); // 让主线程稍作延迟后再发起中断 Thread.sleep(2000); // 发起中断请求 thread.interrupt(); // 等待子线程结束 thread.join(); } } ``` 在这个例子中,子线程在每次迭代之前都会检查自身的中断状态。如果发现已被标记为中断,则提前退出循环。另外,当线程因调用 `sleep()` 而进入阻塞状态时,一旦收到中断信号便会抛出 `InterruptedException` 并跳出阻塞。 #### 3. 清理资源与恢复中断状态 为了确保程序逻辑的一致性和健壮性,在捕获到 `InterruptedException` 后通常需要显式地恢复中断状态以便其他部分能够感知到这一事件的发生。这一步骤非常重要,尤其是在复杂的多层调用场景下可以避免遗漏处理潜在的中断情况。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值