`

如何正确停止线程?

 
阅读更多

为什么不强制停止?而是通知、协作

对于 Java 而言,最正确的停止线程的方式是使用 interrupt。但 interrupt 仅仅起到通知被停止线程的作用。而对于被停止的线程而言,它拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间后停止,也可以选择压根不停止。那么为什么 Java 不提供强制停止线程的能力呢?

 

事实上,Java 希望程序间能够相互通知、相互协作地管理线程,因为如果不了解对方正在做的工作,贸然强制停止线程就可能会造成一些安全的问题,为了避免造成问题就需要给对方一定的时间来整理收尾工作。比如:线程正在写入一个文件,这时收到终止信号,它就需要根据自身业务判断,是选择立即停止,还是将整个文件写入成功后停止,而如果选择立即停止就可能造成数据不完整,不管是中断命令发起者,还是接收者都不希望数据出现问题。

 

明白 Java 停止线程的设计原则之后,我们看看如何用代码实现停止线程的逻辑。我们一旦调用某个线程的 interrupt() 之后,这个线程的中断标记位就会被设置成 true。每个线程都有这样的标记位,当线程执行时,应该定期检查这个标记位,如果标记位被设置成 true,就说明有程序想终止该线程。回到源码,可以看到在 while 循环体判断语句中,首先通过 Thread.currentThread().isInterrupt() 判断线程是否被中断,随后检查是否还有工作要做。&& 逻辑表示只有当两个判断条件同时满足的情况下,才会去执行下面的工作。

分享到:
评论

相关推荐

    易语言正确退出线程

    然而,线程的管理,特别是正确地结束线程,是多线程编程中必须面对的问题。不恰当的线程终止可能导致资源泄漏、数据不一致或其他未预期的行为。 正确退出线程有以下几点需要注意: 1. **线程同步**:在退出线程...

    C#-正确结束线程-通过给定信号结束线程.rar

    C#提供了多种方法来停止线程,但推荐的方法是使用线程的协同终止,即通过共享状态或信号来告知线程何时应该退出。 1. **线程协作终止:** C#中,线程的协作终止通常涉及到线程的取消标志,如`Thread.IsAlive`和`...

    关于线程的动态停止,一个很经典的多线程麦票程序

    通常推荐使用共享标志或中断来停止线程。 - 共享标志:线程在循环中检查一个共享变量(如`isRunning`),当外部设置这个标志为false时,线程会在下次迭代时自行停止。 - `Thread.interrupt()`:可以向线程发送一个...

    C#停止线程的方法

    本文将详细讨论如何在C#中正确地停止线程。 首先,C#并没有提供直接的“Stop”方法来结束一个线程,因为这样做可能会导致数据不一致性和资源泄露。因此,推荐使用协作式的方式来停止线程,即让线程自己检查是否应该...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    Java提供了一种不推荐的方式来停止线程,即使用`Thread.stop()`,但这个方法不安全,因为它可能导致数据不一致和资源泄露。更好的做法是使用标志变量,如`volatile boolean stopRequested`,当主线程或其他线程想要...

    Qt之线程的开始暂停恢复停止 源码

    最后,停止线程是一个需要注意的地方,因为直接销毁`QThread`对象并不能确保线程中的工作被安全停止。正确的做法是使用信号和槽机制通知线程退出`run()`函数,然后等待线程结束,最后再删除`QThread`对象: ```cpp ...

    一个简单的多线程例子,启动线程与终止线程。

    本示例提供了一个简单的多线程应用,旨在帮助理解如何创建、启动和停止线程。以下将详细讲解相关知识点。 首先,我们讨论如何**创建多线程**。在Java中,有两种主要的方法来创建线程:通过继承Thread类或实现...

    C#092线程的启动和停止 源代码

    但是,这并不能立即停止线程,只能让线程在等待I/O、锁或其他阻塞操作时抛出一个ThreadInterruptedException异常,从而有机会退出。 3. **Abort方法**:Thread类的Abort方法会立即终止线程,但这是非常危险的,因为...

    面试官:如何终止线程?有几种方式?

    `interrupt()`方法是一种更加安全的终止线程的方式,它并不立即停止线程,而是设置线程的中断状态。目标线程在执行过程中,尤其是阻塞在IO操作或者`wait()`、`sleep()`等方法时,会检测到中断状态并抛出`...

    JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止

    Java没有提供直接的`Thread.stop()`方法来安全地停止线程,而是建议通过共享变量或者中断机制来让线程自行决定何时结束。例如,设置一个布尔标志,线程在检查这个标志时发现需要结束,然后自行退出。 5. **示例代码...

    c# 多线程任务中结束全部线程

    在C#中,多线程是程序设计中的一个重要概念,它允许程序同时执行多个...在处理多线程任务时,特别需要注意的是线程安全性和资源管理,确保所有线程都能够正确地启动、执行和终止,避免出现死锁、资源泄漏等常见问题。

    Android线程结束——合理的结束你想结束的线程

    2. **使用interrupt()方法**:如果线程在循环或阻塞操作中,可以调用interrupt()方法来标记线程应该停止执行。在循环或阻塞操作中,应定期检查isInterrupted()状态,以便在收到中断信号后优雅地退出。 3. **线程的...

    C#多线程并行管理,通过Task实现,可随时暂停,继续以及停止等

    本主题主要关注如何利用`Task`类来实现多线程并行控制,并且具备暂停、继续和停止任务的能力。`Task`是.NET Framework中的异步编程模型,它提供了对并发执行任务的强大支持。 首先,`Task`类是System.Threading....

    esp32 线程

    ESP32支持线程功能,可以利用线程实现多任务。ESP32上线程的用法和pyboard上差不多,都是通过_thread模块。下面演示了线程的基本用法,程序定义了三个线程,一个线程控制LED,另外两个线程打印信息。

    java线程强制停止的两个Demo

    Java提供了多种方法来尝试停止线程,但需要注意的是,直接中断线程可能会导致数据不一致和资源泄漏等问题,因此应当谨慎使用。下面我们将详细讨论Java中两种常见的线程强制停止的方法,并通过`AlternateStop.java`和...

    C++ 线程暂停、继续

    如果需要优雅地停止线程,可以使用一个共享的“退出标志”,线程定期检查这个标志并根据需要安全地终止自身。 总的来说,理解和掌握线程的创建、管理以及在特定情况下(如暂停、继续)的控制是C++多线程编程的关键...

    利用idhttp进行多线程下载

    为了确保正确地合并所有部分,你需要在主线程中按照正确的顺序写入每个线程下载的数据到同一个文件。 此外,注意处理可能出现的错误,比如网络中断、服务器错误等。在每个线程中添加适当的错误处理代码,确保异常...

    java多线程面试题和答案

    1. **什么是Java多线程?** 多线程是指在单个程序中同时执行多个线程,这样可以提高应用程序的效率和响应速度。Java通过`Thread`类和`Runnable`接口支持多线程编程。 2. **Java中的线程创建方式有哪些?** - 继承...

    qt object多线程- 串口通信

    在Qt框架中,多线程和串口通信是两个重要的技术点,它们在开发复杂的桌面应用或设备控制软件时尤其常见。本篇文章将深入探讨如何在Qt中利用对象的继承...同时,要正确管理线程的生命周期,防止内存泄漏和未响应的线程。

    Java中停止线程执行的方法

    本文将深入探讨如何在Java中正确地暂停或停止线程,以及为何不推荐使用wait()和notify()来实现这一目标。 首先,我们要了解Java中线程的生命周期,包括新建(New)、可运行(Runnable)、运行(Running)、阻塞...

Global site tag (gtag.js) - Google Analytics