首先,看看Thread类里的几个方法:
public static boolean interrupted | 测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。 |
public boolean isInterrupted () |
测试线程是否已经中断。线程的中断状态 不受该方法的影响。 |
public void interrupt () |
中断线程。 |
上面列出了与中断有关的几个方法及其行为,可以看到interrupt是中断线程。如果不了解Java的中断机制,这样的一种解释极容易造成误解,认为调用了线程的interrupt方法就一定会中断线程。
其实,Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的 时机中断自己。每个线程都有一个boolean的中断状态(不一定就是对象的属性,事实上,该状态也确实不是Thread的字段),interrupt方 法仅仅只是将该状态置为true。如下例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class TestInterrupt {
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
t.interrupt();
System.out.println( "已调用线程的interrupt方法" );
}
static class MyThread extends Thread {
public void run() {
int num = longTimeRunningNonInterruptMethod( 2 , 0 );
System.out.println( "长时间任务运行结束,num=" + num);
System.out.println( "线程的中断状态:" + Thread.interrupted());
}
private static int longTimeRunningNonInterruptMethod( int count, int initNum) {
for ( int i= 0 ; i for ( int j= 0 ; j initNum ++;
}
}
return initNum;
}
}
} |
一般情况下,会打印如下内容:
已调用线程的interrupt方法
长时间任务运行结束,num=-2
线程的中断状态:true
可见,interrupt方法并不一定能中断线程。但是,如果改成下面的程序,情况会怎样呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import java.util.concurrent.TimeUnit;
public class TestInterrupt {
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
t.interrupt();
System.out.println( "已调用线程的interrupt方法" );
}
static class MyThread extends Thread {
public void run() {
int num = - 1 ;
try {
num = longTimeRunningInterruptMethod( 2 , 0 );
} catch (InterruptedException e) {
System.out.println( "线程被中断" );
throw new RuntimeException(e);
}
System.out.println( "长时间任务运行结束,num=" + num);
System.out.println( "线程的中断状态:" + Thread.interrupted());
}
private static int longTimeRunningInterruptMethod( int count, int initNum) throws InterruptedException{
for ( int i= 0 ; i TimeUnit.SECONDS.sleep( 5 );
}
return initNum;
}
}
} |
经运行可以发现,程序抛出异常停止了,run方法里的后两条打印语句没有执行。那么,区别在哪里?
一般说来,如果一个方法声明抛出InterruptedException,表示该方法是可中断的(没有在方法中处理中断却也声明抛出 InterruptedException的除外),也就是说可中断方法会对interrupt调用做出响应(例如sleep响应interrupt的操 作包括清除中断状态,抛出InterruptedException),如果interrupt调用是在可中断方法之前调用,可中断方法一定会处理中断, 像上面的例子,interrupt方法极可能在run未进入sleep的时候就调用了,但sleep检测到中断,就是处理该中断。如果在可中断方法正在执 行中的时候调用interrupt,会怎么样呢?这就要看可中断方法处理中断的时机了,只要可中断方法能检测到中断状态为true,就应该处理中断。让我 们为开头的那段代码加上中断处理。
那么自定义的可中断方法该如何处理中断呢?那就是在适合处理中断的地方检测线程中断状态并处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public class TestInterrupt {
public static void main(String[] args) throws Exception {
Thread t = new MyThread();
t.start();
// TimeUnit.SECONDS.sleep(1);//如果不能看到处理过程中被中断的情形,可以启用这句再看看效果 t.interrupt();
System.out.println( "已调用线程的interrupt方法" );
}
static class MyThread extends Thread {
public void run() {
int num;
try {
num = longTimeRunningNonInterruptMethod( 2 , 0 );
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println( "长时间任务运行结束,num=" + num);
System.out.println( "线程的中断状态:" + Thread.interrupted());
}
private static int longTimeRunningNonInterruptMethod( int count, int initNum) throws InterruptedException {
if (interrupted()) {
throw new InterruptedException( "正式处理前线程已经被请求中断" );
}
for ( int i= 0 ; i for ( int j= 0 ; j initNum ++;
}
//假如这就是一个合适的地方
if (interrupted()) {
//回滚数据,清理操作等
throw new InterruptedException( "线程正在处理过程中被中断" );
}
}
return initNum;
}
}
} |
如上面的代码,方法longTimeRunningNonInterruptMethod此时已是一个可中断的方法了。在进入方法的时候判断是否被请求中断,如果是,就不进行相应的处理了;处理过程中,可能也有合适的地方处理中断,例如上面最内层循环结束后。
这段代码中检测中断用了Thread的静态方法interrupted,它将中断状态置为false,并将之前的状态返回,而isInterrupted只是检测中断,并不改变中断状态。一般来说,处理过了中断请求,应该将其状态置为false。但具体还要看实际情形。
相关推荐
Java线程中断机制是Java多线程编程中的一个重要概念,它允许程序在执行过程中通过某种方式通知线程停止其当前的活动,以便进行资源释放或流程控制。在Java中,线程中断主要通过`Thread.interrupt()`方法实现,这个...
Java 中断机制是多线程编程中的一种重要机制。它允许一个线程请求另一个线程停止执行某个操作或退出线程。Java 提供了多种方式来中断线程,包括使用 stop() 方法、interrupt() 方法和使用 volatile 变量等。 一、...
Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...
### Java并行机制的核心知识点解析 #### 一、Java并发机制概述 Java作为一种广泛应用的编程语言,自诞生之初就内置了关键的并发概念,如线程(Thread)和锁(Lock)。随着多核处理器的普及以及对高性能计算的需求...
Java锁机制是多线程编程中的关键概念,用于控制对共享资源的并发访问。在Java中,主要的锁机制包括`synchronized`关键字和`Lock`接口(如`ReentrantLock`)。下面将详细讲解这两种锁机制及其应用。 1. `...
【Java线程中断机制详解】 Java线程的中断机制是一种优雅的终止或中断线程执行的方式,它允许线程在执行过程中响应中断请求,而不仅仅是简单地强制终止。中断机制的核心在于,它允许线程在适当的时候从阻塞状态中...
Java锁机制是多线程编程中的关键组成部分,用于控制对共享资源的访问,确保并发环境下的数据一致性。本文将深入探讨Java锁机制,并基于提供的"面向Java锁机制的字节码自动重构框架"来讨论其背后的原理和应用。 在...
在Java多线程编程中,中断机制是一种优雅的线程停止策略,相比已废弃的`stop()`方法,中断机制提供了更安全、可控的方式来结束线程的执行。本文将深入探讨`stop()`, `interrupted()`以及`isInterrupted()`这三个方法...
首先,我们需要了解Java中的线程中断机制。线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行时,这个中断标志通常不会立即导致线程停止,而是作为一种请求,告知线程...
这个概念在【标题】"Java中断言使用案例"中被强调,而【描述】进一步指出文档会探讨使用断言的优势及其用法。下面将详细阐述Java中断言的原理、好处以及如何使用。 1. **什么是Java断言**: Java断言是一种机制,...
"Java多线程中断机制三种方法及示例" Java多线程中断机制是Java编程语言中一个重要的概念,涉及到线程的生命周期和线程的协作机制。中断机制是一种协作机制,通过中断并不能直接终止另一个线程,而需要被中断的线程...
Java线程机制是Java编程语言中的一个重要特性,它使得开发者能够在单个应用程序中同时执行多个任务,从而提高程序的效率和响应性。Java通过内置的线程支持使得多线程编程变得相对简单,与C++等其他语言相比,Java...
Linux 中断机制 Linux 中断机制是一种异步的事件处理机制,可以提高系统的并发处理能力。中断机制可以分为硬中断和软中断两种类型。硬中断是由硬件产生的,比如磁盘、网卡、键盘、时钟等,每个设备或设备集都有它...
Java多线程中断机制及实例详解 Java多线程中断机制是Java语言中的一种机制,用于控制线程的执行和中断。在Java中,线程可以通过interrupt()方法来中断其他线程的执行,而被中断的线程可以通过isInterrupted()方法来...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
Java的线程提供了中断机制,通过`Thread.interrupt()`和`Thread.isInterrupted()`方法来控制和检查线程中断状态。在长时间运行的任务中,应定期检查中断标志,一旦检测到中断,及时清理资源并退出。 ```java ...
### Java多线程机制详解与示例 #### 一、Java多线程机制概述 Java中的多线程机制是程序设计中的一个重要概念,它允许在同一个应用程序中并发执行多个线程,有效地提高了程序的执行效率和响应速度。通过Java语言...
此外,对于长时间运行的任务,可以考虑采用中断机制,使任务能够定期检查是否被中断,以便于在超时后能够及时清理资源并终止执行。 总之,Java提供了多种方法来监控和管理线程的超时,包括使用`Future`、`...