首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java面试】去某东面试遇到并发编程面试题,如何安全中断一个正在运行的线程?

【Java面试】去某东面试遇到并发编程面试题,如何安全中断一个正在运行的线程?

作者头像
Tom弹架构
发布于 2022-09-22 11:42:48
发布于 2022-09-22 11:42:48
4000
举报
文章被收录于专栏:Tom弹架构Tom弹架构

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

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

1、什么是线程?

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

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

ENTER TITLE

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

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

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

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

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

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

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

ENTER TITLE

来看这段代码:

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 个小时。

我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请动动手指分享给更多的人。关注我,面试不再难!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档