一、使用flag停止线程
在Java中,可以通过设置flag的方式来停止线程。flag是一个标志位,通常设置成volatile类型的变量,可以实现不同线程的可见性。设置flag的方式也是最基本的方式。代码如下:
class MyThread extends Thread { private volatile boolean flag = true; //设置成volatile类型 @Override public void run() { while (flag) { //通过flag控制循环条件 //线程执行的任务 } } public void stopThread() { flag = false; } }
上述代码中,MyThread实现了Thread的run方法。其中run方法通过while(flag)控制线程是否继续执行任务。flag默认为true,在stopThread方法中将flag设置为false即可停止线程。
二、使用interrupt停止线程
除了flag的方式,Java中还提供了interrupt的方式来停止线程。interrupt更加灵活,可以在特定的情况下停止线程,而不是强制性地停止。代码如下:
class MyThread extends Thread { @Override public void run() { while (!isInterrupted()) { //通过isInterrupted()控制循环条件 //线程执行的任务 } } public void stopThread() { interrupt(); //调用interrupt方法 } }
上述代码中,MyThread同样实现了Thread的run方法。其中run方法通过!isInterrupted()控制线程是否继续执行任务。isInterrupted默认为false,在stopThread方法中调用interrupt()方法即可停止线程。
三、使用stop停止线程(不推荐)
在早期的版本中,Java提供了stop方法来强制停止线程。但是,由于stop方法可能会导致线程资源未释放,因此stop方法已经被Deprecated。不建议使用stop方法。如果必须使用,也请注意相关的注意事项。
class MyThread extends Thread { @Override public void run() { while (true) { //无限循环 //线程执行的任务 } } public void stopThread() { stop(); //调用stop方法 } }
四、使用Thread.interrupted()判断线程是否被中断
使用interrupt方式中,需要通过代码来判断线程是否被中断,以控制线程的执行。可以使用Thread类中的interrupted()或isInterrupted()方法判断。代码如下:
class MyThread extends Thread { @Override public void run() { while (!Thread.interrupted()) { //通过Thread.interrupted()控制循环条件 //线程执行的任务 } } public void stopThread() { interrupt(); //调用interrupt方法 } }
在上述代码中,run方法中的while(!Thread.interrupted())与while(!isInterrupted())相同,Thread.interrupted()方法是一个静态方法,可以返回当前线程是否被中断。调用interrupt方法可中断线程。
五、小结
本文介绍了Java中如何停止线程,并详细说明了多种方式的实现方法及注意事项。通常情况下,flag和interrupt是比较合适的方式。stop方法虽然方便,但是不建议使用,有可能导致线程资源未释放。