上一篇博客讲过线程的中断,特别提到过interrupt()这个方法,现在来详细讲述一下这个方法,以及这个方法的用途。
JDK1.0之前,有一个方法stop()方法可以强制一个线程的中断,但是现在这个方法被废弃了,但是还是有一种方法可以请求终止一个线程,它就是interrupt()方法。
当程序运行到interrupt()方法之后,线程的(interrupt status)中断状态将会被置位。它是一个布尔类型的数据,存在于每一个线程中,将它赋值扯过true。每一个线程都应该会不时的检查它的状态。如果线程被阻塞了,那么就无法检查中断状态了,这样就会产生InterruptException异常的地方,当给一个被阻塞的线程调用interrupt方法时,阻塞调用(例如wait和sleep方法)将会被这个异常终止。
所以没有一个任何语言规定一个线程调用interrupt之后就一定会被中断,中断一个线程只是引起这个线程的注意,有时侯不仅不会出现线程中断反而是让处于阻塞状态的程序继续运行。
我下面的程序能很好的解释这一点
package test6;
public class Thread1 extends Thread {
public void run(){
int a = 10;
while(a++<52){
if(a>50){
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(a);
}
System.out.println("i have more to do");
}
}
package test6;
public class TestThread {
public static void main(String[] args) {
Thread thread = new Thread1();
thread.start();
thread.interrupt();
}
}
在测试类中将看到,程序先从1输出到50,然后抛出一个异常,最后输出51。
所以中断线程比我们想想的要复杂得多,在写一个中断sleep状态的多线程程序。
package test6;
import java.util.Date;
public class Thread2 extends Thread{
public void run(){
System.out.println("睡眠之前");
long start = System.currentTimeMillis();
try {
Thread2.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("程序运行的时间是"+(end-start));
System.out.println("睡眠之后");
}
}
package test6;
public class TestThread {
public static void main(String[] args) {
Thread thread = new Thread2();
thread.start();
thread.interrupt();//将这句话注释掉就能看到效果了
}
}
打断是运行只有1ms ,不打断1000ms。这就是效果了。
值得注意的是,当sleep方法抛出异常的时候,线程就会清除该中断状态。
JDK1.0之后,对于多线程有一些相似的方法
void interrupt():发送一个中断请求给线程,将中断状态设置为true.
static boolean interrupted():检查当前线程是不是被中断了,如果中断了就清空中断状态。
boolean isinterrupted();检查当前线程的中断状态
分享到:
相关推荐
java中断线程的正确姿势完整示例.rar
主要介绍了Java中断线程的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程...
主要介绍了Java中断一个线程操作,结合实例形式分析了java中断线程相关的interrupt()、isInterrupted()及interrupted()函数使用技巧,需要的朋友可以参考下
Java 实例 - 中断线程源代码+详细指导教程.zip
该方法“中断线程”,但仅仅是会设置该线程的中断状态位为true,至于中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。 线程会不时地检测这个中断标示位,以判断线程...
Java基本功之中断线程的理解[参考].pdf
java线程中断之interrupt和stop.docx
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java的线程机制是抢占式的,这表示调试 机制会周期性的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都分分配到数据合理的时间去驱动 它的任务。在多线程中,一般对于static用的...
锁定排序 3.6 线程优先级 3.7 监控程序线程 3.8 在应用程序中...线程中断 3.10 完成DownloadManager 3.11 线程中的过时方法 3.12 DownloadFiles类 3.13 未捕捉的异常 3.14 自愿放弃...
Java多线程与线程安全实践-基于Http协议的断点续传.rar 是一个Java毕业设计项目,旨在探讨如何在Java中实现多线程和线程安全,以及如何基于Http协议实现断点续传功能。该项目提供了一个完整的源代码包,可以作为学习...
本毕业设计题目旨在研究和实现一个基于Java多线程与线程安全机制的断点续传下载工具。随着互联网的普及,文件的下载需求日益增加,而大文件的下载往往需要较长的时间,一旦出现网络中断或意外情况,就需要从头开始...
interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程
Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下
Java线程中断示例程序的代码清单.pdf 学习资料 复习资料 教学资源
#Java多线程示例-Java多线程应用实例 1- Java多线程:启动线程 2- Java多线程:易失性–基本线程通信 3- Java多线程:同步 4- Java多线程:锁定对象 5- Java多线程:线程池 ...14- Java多线程:中断线程 从分叉
该Java程序使用Eclipse编写,完成了定时收发UDP的功能。其中体现了线程使用、Jni接口调用、精确定时、模拟鼠标串口等功能。
主要介绍了JAVA多线程之中断机制stop()、interrupted()、isInterrupted()的相关资料,需要的朋友可以参考下