上一篇博客讲过线程的中断,特别提到过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中断线程的正确方法,以确保线程安全且高效地退出。 首先,我们需要了解Java中的线程中断机制。线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行...
以下是关于Java中断线程的一些关键知识点: 1. **线程状态**:在Java中,线程有多种状态,包括新建、可运行、运行、阻塞、等待、超时等待和终止。中断线程主要是针对那些处于运行、阻塞或等待状态的线程。 2. **...
以下是对Java中断线程的详细解释: 1. **线程终止条件**: - 当`run`方法执行完毕。 - `return`语句执行,提前结束`run`方法。 - 出现未捕获的异常,导致`run`方法终止。 2. **`stop`方法的弃用**: Java早期...
9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...
- interrupt()方法用于中断线程,如果线程正在阻塞(如sleep或wait),会被中断并抛出InterruptedException。 通过这些技术,我们可以构建高效、稳定、响应迅速的多线程应用程序。在实际开发中,应根据具体需求...
1. Thread.interrupt():用于中断线程,但不一定立即停止,需要在run()方法内部检查中断标志并作出相应处理。 2. InterruptedException:线程被中断时抛出的异常,通常需要捕获并处理。 九、线程死锁 1. 死锁的概念...
Java的Thread类提供了start()来启动线程,interrupt()来中断线程,但需要注意的是,中断并不一定能立即停止线程,线程需要自行检查并响应中断状态。 另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多...
// 超时后中断线程 } ``` 基本数据类型在超时控制中主要体现在计算或比较操作上,例如,我们可以用long类型的变量记录开始时间,然后在超时检查时与当前时间进行比较。反射则允许我们在运行时动态获取类、方法和...
在Java中,中断线程主要是通过调用`Thread`对象的`interrupt()`方法来实现的。这个方法并不会立即停止目标线程,而是设置一个中断标志,表明线程已被请求中断。如果线程处于阻塞状态(例如在`sleep()`, `wait()`, ...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
而检查异常(Checked Exceptions)如果在线程中抛出,需在该线程或其祖先线程中捕获,否则会导致线程中断。 最后,书中还将涵盖Java内存模型(JMM)和volatile关键字。JMM定义了线程如何访问共享变量的规则,保证了...
在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点...
Thread类提供了interrupt()方法用于中断线程,但是需要注意的是,中断并不是立即停止线程,而是设置一个中断标志,线程需要在适当的地方检查这个标志并处理中断。 通过对以上知识点的深入理解和实践,开发者可以...
Java 多线程该存储库包含 ...Java 多线程低级生产者-消费者10- Java 多线程可重入锁11- Java 多线程死锁12- Java 多线程信号量13- Java 多线程Callable 和 Future14- Java 多线程中断线程贡献者Z. Berkay Celik@IOAyman
Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后自行决定是否停止。守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护...
Java中控制线程的方法有多种,如start()启动线程,run()执行线程,sleep()让线程休眠,join()等待其他线程完成,yield()让当前线程暂停,让其他线程有机会执行,以及interrupt()和isInterrupted()用于中断和检查线程...
Java提供了一个更安全的中断线程的机制,即`Thread.interrupt()`。当调用`interrupt()`时,目标线程的中断状态会被设置,线程在检查到中断状态后可以决定如何响应。例如,`Thread.sleep()`、`SocketInputStream....
- **简化信号处理**:线程可以在接收到外部信号时快速响应,无需中断整个进程。 - **支持分布式对象**:多线程使得跨网络的数据交换更加高效。 - **跨平台编译**:如POSIX线程和Java线程,可以在不同平台上使用相同...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...