Java中线程停止的实现方式有3种:自定义中断标识、停止线程。使用线程中断方法interrupt来停止线程。使用stop停止线程。其中stop方法是@Deprecated修饰的过期方法,即不推荐的过期方法,因为stop方法会直接停止线程,让线程没有足够的时间处理保存的工作在停止之前,这会导致数据不完整的问题,因此不推荐使用。自定义中断标志也存在一些问题,所以一般来说,中断方式是停止线程最理想的方式。接下来,让我们看看它们的具体区别。1.自定义中断标识符自定义中断标识符是在程序中定义一个变量来判断线程是否应该中断执行,具体实现代码如下:classFlagThreadextendsThread{//自定义中断标识符publicvolatilebooleanisInterrupt=false;@Overridepublicvoidrun(){//Iftrue->中断执行while(!isInterrupt){//业务逻辑处理}}}但是自定义中断标识的问题是线程中断不够及时。因为线程在执行过程中无法调用while(!isInterrupt)判断线程是否终止,只能判断下次运行时是否终止当前线程,所以打断线程不够及时,比如下面code:classInterruptFlag{//自定义中断标识符privatestaticvolatilebooleanisInterrupt=false;publicstaticvoidmain(String[]args)throwsInterruptedException{//创建一个可中断的线程实例Threadthread=newThread(()->{while(!isInterrupt){//如果isInterrupt=true,停止线程System.out.println("线程执行第1步:线程即将进入睡眠状态");try{//睡眠1sThread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("线程执行第2步:线程执行任务");}});thread.start();//启动线程//休眠100ms,等待线程线程正在运行Thread.sleep(100);System.out.println("主线程:试图终止线程thread");//修改中断标识符,中断线程isInterrupt=true;}}上面代码的执行结果如下图所示:我们期望的是:线程执行完第1步后,收到一个中断线程指令,然后不执行第2步,但是从上面的执行结果可以看出,使用自定义的中断标识并不能达到我们预期的效果。这是自定义的中断标识符,响应不够及时。问题2.interrupt中断线程可以使用interrupt方法向执行任务的线程发送中断线程指令。它不直接中断线程,而是发出中断线程的信号,将线程是否被中断的主动权交给代码作者。与自定义中断标识符相比,它可以更及时地接收中断指令,如下代码所示:()->{while(!Thread.currentThread().isInterrupted()){System.out.println("线程执行第1步:线程即将进入睡眠状态");try{//sleep1sThread.sleep(1000);}catch(InterruptedExceptione){System.out.println("线程线程收到中断命令,执行中断操作");//中断当前线程的任务执行break;}System.out.println("线程执行step2:线程已经执行任务");}});thread.start();//启动线程//休眠100ms,等待线程线程运行Thread.sleep(100);System.out.println("主线程:尝试终止线程thread");//修改中断标识中断线程thread.interrupt();}上面代码的执行结果如下图所示:从上面的结果可以看出,线程收到了中断指令,线程立即被打断。与之前自定义中断标识符的方式相比,可以更及时的响应中断线程指令。3.stop停止线程虽然stop方法可以停止线程,但是已经是不推荐使用的废弃方法了。这可以通过Thread类中的源代码找到。stop源码如下:从上图可以看出,stop方法是被@Deprecated修饰的过期方法,不推荐使用,注释的第一句说明stop方法是不安全的方法。在最新的Java版本中,这个方法已经被直接去掉了,所以强烈建议不要使用。总结本文介绍了三种停止线程的方法:自定义中断标识符的stop方法,该方法的缺点是不能及时响应中断请求;中断线程使用interrupt的方法,这种方法是给线程发送中断信号,可以及时响应中断也是最推荐的方法;最后是停止方法。虽然也可以停止线程,但是这个方法已经过时了,不推荐使用。在最新的Java版本中已经直接去掉了,所以不推荐使用。
