在历史上,Java试图提供过抢占式限制中断,但问题多多,例如前文介绍的已被废弃的Thread.stop、Thread.suspend和 Thread.resume等。另一方面,出于Java应用代码的健壮性的考虑,降低了编程门槛,减少不清楚底层机制的程序员无意破坏系统的概率。
如今,Java的线程调度不提供抢占式中断,而采用协作式的中断。其实,协作式的中断,原理很简单,就是轮询某个表示中断的标记,我们在任何普通代码的中都可以实现。 例如下面的代码:
volatile bool isInterrupted;
//…
while(!isInterrupted) {
compute();
}
但是,上述的代码问题也很明显。当compute执行时间比较长时,中断无法及时被响应。另一方面,利用轮询检查标志变量的方式,想要中断wait和sleep等线程阻塞操作也束手无策。
如果仍然利用上面的思路,要想让中断及时被响应,必须在虚拟机底层进行线程调度的对标记变量进行检查。是的,JVM中确实是这样做的。下面摘自java.lang.Thread的源代码:
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
//…
private native boolean isInterrupted(boolean ClearInterrupted);
可以发现,isInterrupted被声明为native方法,取决于JVM底层的实现。
实际上,JVM内部确实为每个线程维护了一个中断标记。但应用程序不能直接访问这个中断变量,必须通过下面几个方法进行操作:
public class Thread {
//设置中断标记
public void interrupt() { ... }
//获取中断标记的值
public boolean isInterrupted() { ... }
//清除中断标记,并返回上一次中断标记的值
public static boolean interrupted() { ... }
...
}
通常情况下,调用线程的interrupt方法,并不能立即引发中断,只是设置了JVM内部的中断标记。因此,通过检查中断标记,应用程序可以做一些特殊操作,也可以完全忽略中断。
你可能想,如果JVM只提供了这种简陋的中断机制,那和应用程序自己定义中断变量并轮询的方法相比,基本也没有什么优势。
JVM内部中断变量的主要优势,就是对于某些情况,提供了模拟自动“中断陷入”的机制。
在执行涉及线程调度的阻塞调用时(例如wait、sleep和join),如果发生中断,被阻塞线程会“尽可能快的”抛出InterruptedException。因此,我们就可以用下面的代码框架来处理线程阻塞中断:
try {
//wait、sleep或join
}
catch(InterruptedException e) {
//某些中断处理工作
}
所谓“尽可能快”,我猜测JVM就是在线程调度调度的间隙检查中断变量,速度取决于JVM的实现和硬件的性能。
然而,对于某些线程阻塞操作,JVM并不会自动抛出InterruptedException异常。例如,某些I/O操作和内部锁操作。对于这类操作,可以用其他方式模拟中断:
1)java.io中的异步socket I/O
读写socket的时候,InputStream和OutputStream的read和write方法会阻塞等待,但不会响应java中断。不过,调用Socket的close方法后,被阻塞线程会抛出SocketException异常。
2)利用Selector实现的异步I/O
如果线程被阻塞于Selector.select(在java.nio.channels中),调用wakeup方法会引起ClosedSelectorException异常。
3)锁获取
如果线程在等待获取一个内部锁,我们将无法中断它。但是,利用Lock类的lockInterruptibly方法,我们可以在等待锁的同时,提供中断能力。
另外,在任务与线程分离的框架中,任务通常并不知道自身会被哪个线程调用,也就不知道调用线程处理中断的策略。所以,在任务设置了线程中断标记后,并不能确保任务会被取消。因此,有以下两条编程原则:
1)除非你知道线程的中断策略,否则不应该中断它。
这条原则告诉我们,不应该直接调用Executer之类框架中线程的interrupt方法,应该利用诸如Future.cancel的方法来取消任务。
2)任务代码不该猜测中断对执行线程的含义。
这条原则告诉我们,一般代码遇在到InterruptedException异常时,不应该将其捕获后“吞掉”,而应该继续向上层代码抛出。
总之,Java中的非抢占式中断机制,要求我们必须改变传统的抢占式中断思路,在理解其本质的基础上,采用相应的原则和模式来编程。
- 浏览: 159626 次
- 性别:
- 来自: 北京
最新评论
-
西巴拉古呀那:
Linux多线程并发服务器编程(线程池,FTP服务器)网盘地址 ...
多线程服务器的适用场合 -
somefuture:
第四题怎麼用位图法。写了半天没出来,用了下面的,速度很快pri ...
位图法应用 -
寂寞秋江:
系统,全面,条理清晰,由浅入深,简直是集大成之作。 特别是最后 ...
单个进程最大线程数 -
darkjune:
有点意思, 不错
单个进程最大线程数 -
kidding87:
谢谢啦,收藏着
google使用一点敲门分享
相关推荐
ARM处理器中断处理的理解 ARM处理器中断处理是 ARM 处理器体系结构中的一种机制,用于处理外部中断信号。中断处理过程可以分为两个阶段:中断请求阶段和中断服务阶段。在中断请求阶段, ARM 处理器会检查外部中断...
以下是关于中断处理的详细解释: 一、中断处理程序架构 1. 中断定义:中断是CPU响应硬件或软件突发事件的一种方式,当事件发生时,CPU暂停当前执行的程序,转而执行特定的中断处理程序,处理完后再返回到被中断的...
以下是关于中断处理的一些关键知识点: 1. **中断和程序流**: - 在操作系统中,程序的执行通常是线性的,即按照指令序列逐条执行。然而,中断可以打断这种顺序执行,使得CPU能够处理紧急或突发的任务,如设备I/O...
中断机构能发现中断事件,且当发现中断事件后迫使正在处理器上执行的进程暂时停止执行,而让操作系统的中断处理程序占有处理器去处理出现的中断事件。对不同的中断事件,由于它们的性质不同,所以操作系统应采用不同...
本文将深入探讨这一主题,介绍如何在Linux系统中进行51单片机的程序开发,特别是关于中断处理的相关知识。 首先,我们要了解51单片机的基本结构。51系列单片机是Intel公司推出的8位微处理器,因其简单易用、资源...
以下是关于中断处理的详细讲解: 1. 中断的概念: 中断是计算机硬件在检测到特定事件时,向处理器发送的一个信号,请求CPU暂停当前执行的任务,转而去执行相应的服务程序。这个服务程序通常被称为中断处理程序。 2...
本课程设计的主题是“模拟中断处理”,这将带你深入理解中断在操作系统中的作用以及如何实现中断处理机制。 中断是计算机硬件提供的一种机制,当系统发生某些事件(如键盘输入、硬件故障或定时器到期)时,处理器会...
### Windows中断处理过程详解 #### 一、概述 在计算机科学领域中,中断处理机制是操作系统内核设计的重要组成部分,特别是在现代多任务操作系统如Windows中更是如此。Windows系统的中断处理流程涉及复杂的硬件与...
在计算机系统中,中断处理和设备驱动程序是操作系统与硬件交互的关键组成部分,它们共同负责管理和协调计算机硬件资源,确保系统高效、稳定地运行。本文将深入探讨这两个概念,以及它们在C语言环境中的实现。 首先...
文件名“int”可能包含的是关于中断处理的相关代码示例或文档,这些资源可以帮助开发者更直观地了解中断体系结构在实际应用中的工作方式,以及如何编写和调试中断服务例程。在学习过程中,结合实践操作和阅读相关...
【中断处理】是计算机系统中一个至关重要的机制,它使得硬件和软件能够协同工作,以应对各种异步事件。在本文中,我们将深入探讨模拟中断事件处理,特别是时钟中断的模拟。 时钟中断是计算机系统中最常见的中断类型...
在深入了解STM32的中断处理之前,首先需要了解一些关于中断的基础概念: 1. **中断**:中断是指当CPU正在执行某个任务时,由于某种原因(如外部硬件设备发出信号)迫使CPU暂时停止当前任务,转去执行相应的中断服务...
在这个名为"中断应用.zip"的压缩包中,包含了一个名为"intrrupt.c"的源代码文件,这很可能是C语言编写的关于中断处理的程序示例。 首先,我们来理解一下中断的基本概念。中断是一种异步通信方式,当外部设备(如...
单片机定时器中断处理是单片机编程中不可或缺的一部分,尤其在实时系统和嵌入式系统中,它扮演着至关重要的角色。定时器中断允许单片机在执行其他任务的同时,按照预设的时间间隔自动执行特定的任务,提高了程序的...
内核中断处理是操作系统核心的重要组成部分,它负责处理硬件设备产生的中断请求,确保系统的稳定运行和高效响应。中断处理机制是计算机系统与外部世界交互的关键途径,它允许系统在执行正常任务的同时,能够及时响应...
**PXA270中断处理详解** PXA270是Marvell公司设计的一款高性能XScale微处理器,常用于嵌入式系统,如移动设备、工业控制和消费电子。其中断处理机制是系统运行中不可或缺的一部分,对于实时性和效率至关重要。在本...
中断处理是计算机操作系统中的核心机制之一,它使得硬件可以向软件发出异步信号,通知操作系统发生了特定事件,例如时钟更新、硬件错误或是外部设备的数据传输完成。在本课程设计中,学生郭涛通过模拟时钟中断事件,...
中断处理机制是操作系统与硬件设备交互的关键技术,它使得计算机系统能高效地处理输入输出(I/O)操作,特别是当I/O设备的速度远低于CPU时。在计算机中,中断是硬件设备向CPU发送的一种信号,通知CPU有特定事件发生...