一个位5年的小伙伴去某东面试被一道并发编程的面试题给Pass了,说”如何中断一个正在运行中的线程?,这个问题很多工作2年的都知道,实在是有些遗憾。
今天,我给大家来分享一下我的回答。
1、什么是线程?
回答这个问题之前,先来回顾一下什么线程?
Thread,线程是操作系统进行运算调度的最小单位。所以,线程是系统级别的概念。
而在 Java 里面实现的线程,最终的执行和调度都是由操作系统来决定的,JVM 只是对操作系统层面的线程做了一层包装而已。
所以我们在 Java 里面调用 start() 方法启动一个线程的时候,只是告诉操作系统这个线程可以被执行,但是最终交给 CPU 来执行,是由操作系统的调度算法来决定的。
2、如何操作如何安全中断运行中的线程?
从理论上来说,要在 Java 层面去中断一个正在运行的线程,只能像类似于 Linux 里面的 kill 命令结束进程的方式一样,强制终止。
Java Thread 的API里面虽然提供了一个 stop() 方法,可以强行终止线程,但是这种方式是不安全的,因为有可能线程的任务还没有完成,突然中断会导致出现运行结果不正确的问题。
要想安全的中断一个正在运行的线程,只能在线程内部埋下一个钩子,外部程序 通过这个钩子来触发线程的中断命令。
因此,在 Java Thread 里面提供了一个 interrupt() 方法,这个方法要配合isInterrupted()方法来使用,就可以实现安全地中断线程运行。
来看这段代码:
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 个小时。
最后,我把之前分享的视频全部整理成了文字,想获取的小伙伴可以扫描文章底部二维码拿!希望能够以此来提高各位粉丝的通过率。