去某东面试遇到并发编程问题:如何安全地中断一个正在运行的线程

简介: 一个位5年的小伙伴去某东面试被一道并发编程的面试题给Pass了,说”如何中断一个正在运行中的线程?,这个问题很多工作2年的都知道,实在是有些遗憾。今天,我给大家来分享一下我的回答。

一个位5年的小伙伴去某东面试被一道并发编程的面试题给Pass了,说”如何中断一个正在运行中的线程?,这个问题很多工作2年的都知道,实在是有些遗憾。

今天,我给大家来分享一下我的回答。

1、什么是线程?

回答这个问题之前,先来回顾一下什么线程?

Thread,线程是操作系统进行运算调度的最小单位。所以,线程是系统级别的概念。

9b109f1b980f7b8f2d1c15a16ad1d46a.jpg

而在 Java 里面实现的线程,最终的执行和调度都是由操作系统来决定的,JVM 只是对操作系统层面的线程做了一层包装而已。

所以我们在 Java 里面调用 start() 方法启动一个线程的时候,只是告诉操作系统这个线程可以被执行,但是最终交给 CPU 来执行,是由操作系统的调度算法来决定的。

2、如何操作如何安全中断运行中的线程?

从理论上来说,要在 Java 层面去中断一个正在运行的线程,只能像类似于 Linux 里面的 kill 命令结束进程的方式一样,强制终止。

Java Thread 的API里面虽然提供了一个 stop() 方法,可以强行终止线程,但是这种方式是不安全的,因为有可能线程的任务还没有完成,突然中断会导致出现运行结果不正确的问题。

要想安全的中断一个正在运行的线程,只能在线程内部埋下一个钩子,外部程序 通过这个钩子来触发线程的中断命令。

因此,在 Java Thread 里面提供了一个 interrupt() 方法,这个方法要配合isInterrupted()方法来使用,就可以实现安全地中断线程运行。

4f04130ccf8f22a823b513b5e0d53752.jpg

来看这段代码:

Runnable runnable = new Runnable(){
    public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()){
                System.out.println("线程被中断了");
                return ;
            } else {
                System.out.println("线程没有被中断");
            }
        }
    }
};
Thread t = new Thread(runnable);
t.start();
Thread.sleep(500);
t.interrupt();
System.out.println("线程中断了,程序到这里了");

这种实现方法并不是强制中断,而是告诉正在运行的线程,你可以停止了。何时实际中断,取决于正在运行的线程,所以,它能够保证线程运行结果的安全性。

这个问题,很多工作了 5 年以上的小伙伴都不一定清楚。虽然CRUD能够熟练上手,但是,和其他人拉开差距的往往是工作之外的 8 个小时。

最后,我把之前分享的视频全部整理成了文字,想获取的小伙伴可以扫描文章底部二维码拿!希望能够以此来提高各位粉丝的通过率。

ee90d9963df444db88b33d6e798a5b94.gif

我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!

相关文章
|
21天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
78 6
|
1月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
22天前
|
设计模式 安全 Java
Java 多线程并发编程
Java多线程并发编程是指在Java程序中使用多个线程同时执行,以提高程序的运行效率和响应速度。通过合理管理和调度线程,可以充分利用多核处理器资源,实现高效的任务处理。本内容将介绍Java多线程的基础概念、实现方式及常见问题解决方法。
43 0
|
2月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
37 3
|
3月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
3月前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
83 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
3月前
|
消息中间件 前端开发 NoSQL
面试官:如何实现线程池任务编排?
面试官:如何实现线程池任务编排?
43 1
面试官:如何实现线程池任务编排?
|
3月前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
66 3
|
3月前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
3月前
|
Java Spring
运行@Async注解的方法的线程池
自定义@Async注解线程池
179 3

相关实验场景

更多
下一篇
DataWorks