多线程编程中,想要要正在运行的线程停止,主要有两种方式:

  • 1使用stop方法强行终止线程,但是不推荐此方法,因为stop方法和suspend及resume一样,都是过期作废的,使用它们很有可能会有不可预料的结果。
  • 2 在多线程的run方法中,通过加入标志位判断配合着 interrupt 标志方法,进行线程的业务逻辑上的停止。

第一种方式不说了,强烈不建议使用stop方法,因为如果强制停止线程可能使一些清理性的工作得不到完成,并且在对于有 锁 对象的进行处理的时候,强制停止会出现不一致情况。

在介绍第二种方式之前,先介绍一下多线程中的两个方法 this.interrupted(); 以及 this.isInterrupted(); 他们都是测试当前线程已经中断的状态,但是还是有区别的。

this.interrupted(): 测试当前线程是否已经中断状态,执行后可以将状态标识清除false,意思就是说,如果你使用thread.interrupt() ; 方法将当前的线程状态标识打上了“是否停止它,true”,那么调用一次this.interrupted(): 后标识就会被改为“是否停止它,false”,那么第二次次继续this.interrupted(): 的时候,状态就会变为了false。

this.isInterrupted();测试当前线程是否已经中断状态,执行后不清除标识状态,停止线程,主要使用该方法进行判断,代码如下

代码1—- 通过main方法中的对线程使用interrupt方法,打上标志位,在run逻辑代码中进行判断,然后直接退出循环,或者返回结果,进行停止线程。

java线程waitingCPU高 java线程stop_java线程waitingCPU高


java线程waitingCPU高 java线程stop_main方法_02


这里写图片描述代码2—- 抛异常后,try中下部分代码不执行了,达到停止线程的目的,然后执行catch方法。

java线程waitingCPU高 java线程stop_停止线程_03


java线程waitingCPU高 java线程stop_停止线程_04

建议使用 抛异常的方法来实现线程停止,因为可以在catche块中一层一层向上抛,达到层层传播的目的。