- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
两者都会导致程序停止执行。不过,很明显,这种情况的发生方式肯定存在一些差异。它们是什么?
最佳答案
thread.interrupt()
不会停止线程。它用于多线程程序中的协调。除非您确切知道自己在做什么,否则不要使用它。RuntimeException
将(通常)终止线程,但不一定终止程序。System.exit(int)
几乎总是终止程序并返回状态码。System.exit(int)
可能不会真正停止程序。另一方面,Runtime.getRuntime().halt(int)
总是这样。恐怕你的第一句话是错误的。 Thread.currentThread().interrupt()
不会停止线程或程序。
中断线程是表示它应该停止的一种方式,但这是一种合作努力:线程中的代码应该不时检查中断状态并且(在大多数情况下)情况下 - 但即使这只是可选的)如果被中断也应该停止。如果不这样做,什么都不会发生。
具体来说,中断一个线程(任何线程,包括当前正在执行的线程)只会设置 interrupted 标志。标准库中的某些方法会抛出 InterruptedException,但这也只是表示线程已被中断的一种方式。在这种情况下应该怎么做取决于该线程中运行的代码。
以下是 Brian Goetz 的 Java Concurrency in Practice 一书中的相关部分:
Thread provides the interrupt method for interrupting a thread and for querying whether a thread has been interrupted. Each thread has a boolean property that represents its interrupted status; interrupting a thread sets this status.
Interruption is a cooperative mechanism. One thread cannot force another to stop what it is doing and do something else; when thread A interrupts thread B, A is merely requesting that B stop what it is doing when it gets to a convenient stopping point if it feels like it.While there is nothing in the API or language specification that demands any specific application level semantics for interruption, the most sensible use for interruption is to cancel an activity. Blocking methods that are responsive to interruption make it easier to cancel long running activities on a timely basis.
Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.
所以调用 exit()
将(几乎)肯定会停止您的程序。与抛出 RuntimeException
(或 Error
)相比,这不能在调用堆栈的某个地方被捕获,并且它也不依赖于是否有其他线程在运行。另一方面,未捕获的异常会终止引发它的线程,但如果有任何其他(非守护程序)线程,程序将继续运行。
与抛出异常的另一个区别是 exit()
不会向控制台打印任何内容(就像未捕获的异常一样),而是使程序返回特定的状态代码。状态码有时用于 shell 或批处理脚本,但除此之外,它们不是很有用。
最后(为了完整起见),我想指出退出 Java 程序的第三种可能性。当 System.exit(int)
被调用(或程序以某种其他方式结束)时,运行时会在 Java 虚拟机停止之前进行一些清理工作。这在 Runtime.exit(int) 的 Javadoc 中有描述。 (由 System.exit(int)
调用:
The virtual machine's shutdown sequence consists of two phases. In the first phase all registered shutdown hooks, if any, are started in some unspecified order and allowed to run concurrently until they finish. In the second phase all uninvoked finalizers are run if finalization-on-exit has been enabled. Once this is done the virtual machine halts.
如果任何关闭 Hook 或终结器无法完成,例如因为 deadlock ,程序可能永远不会真正退出。保证 JVM 停止的唯一方法是 Runtime.halt(int) :
This method should be used with extreme caution. Unlike the exit method, this method does not cause shutdown hooks to be started and does not run uninvoked finalizers if finalization-on-exit has been enabled.
关于java - 在 Java 程序的主线程中调用 System.exit(0) 和 Thread.currentThread().interrupt() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12572456/
我在我的操作系统内核中编写了一些函数来在指令计数器溢出时发出性能监控中断 (PMI)。它在我的机器(Intel core i5)上运行良好。但是当我使用 在 qemu 上运行它时 qemu-syste
这个问题已经有答案了: What does java.lang.Thread.interrupt() do? (10 个回答) 已关闭10 年前。 从设置线程状态的角度,我对这两种方法不太清楚。 Ja
使用 LPTIM1 中断处理程序,我的代码设置为在进入处理程序后立即清除中断标志,但在调试期间,“中断清除寄存器”(ICR) 中的标志未设置为 0,因此程序直接跳转到由于在“中断和状态寄存器”(ISR
我还没有找到任何关于 MC68000 在外部中断期间是否保留其状态寄存器/CCR 的信息。我想如果 CPU 在条件分支之前立即中断,并且中断修改了 CCR,这将是一个问题。现在我的中断代码如下所示:
我需要弄清楚为什么我在 Internet 上找到的每个关于如何从 Runnable#run() 方法中捕获 interrupt() 的示例,它们看起来都是像这样: while (Thread.curr
运行下面的代码后,我收到标题中的错误。 #include int main() { printf("hello World!\n"); retu
我想知道 Thread.interrupt() 和 Thread.currentThread.interrupt() 是否做同样的事情或者会给出相同的结果?如果不是,有什么区别? 类似的问题是:Thr
我正在阅读 Java Concurrency in Practice 并遇到以下代码片段。 public static void timedRun(final Runnable r,
在嵌入式项目中,我需要使用同一个 IRQ 处理程序处理两个不同的外部中断。我不想直接更改启动程序集中的中断 vector 表条目,因此我必须坚持使用 IRQ 处理程序例程(EXTI9_5_IRQHan
的教育原则是:没有愚蠢的问题。这背后的基本思想是人们通过提问来学习。 我被要求:“你能在编程层面展示和解释如果每个任务都可以执行所有指令会发生什么坏事吗?” 我确实给了代码 main(){
我正在为 VM 的 IO 进行 KVM 优化。我看过KVM代码,通常所有的物理中断都会导致VMexit进入KVM。然后主机的IDT会处理相应的物理中断。我的问题是 KVM 如何决定是否向 guest
我正在尝试做这样的事情 $SIG{ALRM} = sub { print $line_number_when_alarm_went_off; }; alarm 10; # rest of th
首先,我应该分享我所知道的一切-那完全是混乱。关于这个主题有几个不同的问题,所以请不要烦恼:)。 1)为了找到一个ISR,CPU提供了一个中断号。在x86机器(286/386及更高版本)中,有一个带有
我有一个关于linux系统调用的基本问题。 为什么系统调用不像正常的函数调用那样处理,而是通过软件中断处理? 是不是因为在用户应用程序的构建过程中,没有为用户空间应用程序与内核执行链接过程? 最佳答案
我使用的是stm32f0 MCU。 我有一个简单的 UART 回显代码,其中接收到的每个字节都将被发送出去。我测试过它有效。在这里; uint8_t Rx_data[5]; uint32_t tx_t
是否有专门针对 msp430F5438A 的中断服务例程 (ISR) 名称的完整列表?任何帮助将不胜感激,谢谢。 最佳答案 您可以在 msp430/include/msp430f5438a 中找到 #
是否有专门针对 msp430F5438A 的中断服务例程 (ISR) 名称的完整列表?任何帮助将不胜感激,谢谢。 最佳答案 您可以在 msp430/include/msp430f5438a 中找到 #
中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。
我正在开发一个操作系统项目,使用 isolinux (syslinux 4.5) 作为引导加载程序,加载我的内核与组织在 0x200000 的多重引导头文件。 据我所知,内核已经处于 32 位保护模式
我正在处理一个启动时间要求很紧的项目。目标架构是在 32 位保护模式下运行的基于 IA-32 的处理器。确定可以改进的领域之一是当前系统动态初始化处理器的 IDT(中断描述符表)。由于我们没有任何即插
我是一名优秀的程序员,十分优秀!