Java 线程中断
来源:互联网 发布:gta5卡怎么优化 编辑:程序博客网 时间:2024/06/03 16:03
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了.
那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢? 优雅的方法就是, 给那个线程一个中断信号, 让它自己决定该怎么办. 比如说, 在某个子线程中为了等待一些特定条件的到来, 你调用了Thread.sleep(10000), 预期线程睡10秒之后自己醒来, 但是如果这个特定条件提前到来的话, 你怎么通知一个在睡觉的线程呢? 又比如说, 主线程通过调用子线程的join方法阻塞自己以等待子线程结束, 但是子线程运行过程中发现自己没办法在短时间内结束, 于是它需要想办法告诉主线程别等我了. 这些情况下, 就需要中断.
那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢? 优雅的方法就是, 给那个线程一个中断信号, 让它自己决定该怎么办. 比如说, 在某个子线程中为了等待一些特定条件的到来, 你调用了Thread.sleep(10000), 预期线程睡10秒之后自己醒来, 但是如果这个特定条件提前到来的话, 你怎么通知一个在睡觉的线程呢? 又比如说, 主线程通过调用子线程的join方法阻塞自己以等待子线程结束, 但是子线程运行过程中发现自己没办法在短时间内结束, 于是它需要想办法告诉主线程别等我了. 这些情况下, 就需要中断.
中断是通过调用Thread.interrupt()方法来做的. 这个方法通过修改了被调用线程的中断状态来告知那个线程, 说它被中断了. 对于非阻塞中的线程, 只是改变了中断状态, 即Thread.isInterrupted()将返回true; 对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程, Thread.sleep(), Object.wait(), Thread.join(), 这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false.
中断状态可以通过 Thread.isInterrupted()来读取,并且可以通过一个名为 Thread.interrupted()的静态方法读取和清除状态(即调用该方法结束之后, 中断状态会变成false)。
由于处于阻塞状态的线程 被中断后抛出exception并置回中断状态, 有时候是不利的, 因为这个中断状态可能会作为别的线程的判断条件, 所以稳妥的办法是在处理exception的地方把状态复位:
public class ThreadInterrupt extends Thread { @Override public synchronized void start() { super.start(); System.out.println("ThreadInterrupt is start!"); } public synchronized void kill() { interrupt(); System.out.println("ThreadInterrupt is kill!"); } @Override public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(1000); // 延迟50秒 System.out.println("ThreadInterrupt is runing!"); } catch (InterruptedException e) { interrupt(); } } }}
阅读全文
0 0
- Java线程:线程中断
- Java线程中断机制-如何中断线程
- 中断JAVA线程
- 中断JAVA线程
- 中断Java线程
- 中断JAVA线程
- 正确中断java线程
- 中断JAVA线程
- Java 可中断线程
- 中断Java线程
- Java 线程中断
- java线程中断
- Java线程中断
- 如何中断JAVA线程
- JAVA线程中断
- Java线程中断
- java 可中断线程
- Java中的线程中断
- Java-Eclipse安装教程
- D27 Akka实现,及自定义RPC
- EventBus(二)之源码分析
- 内核中的page fault & copy_from_user
- 阻塞队列
- Java 线程中断
- Java 轻量级调用 FTP 上传(安卓可用)
- LINUX下安装ORACLE 11G
- D28 Spark基础
- Mips TLB miss异常
- org.json.JSONException: Value java.net.UnknownHostException of type java.lang.String cannot be conv
- HDU
- 【javascript】您好, 您要的ECMAScript6速记套餐到了 (一)
- D29 RDD高级算子