嘉定区 网站建设,宁波建材信息造价中心,做特价的网站百度,软件开发公司简介模板怎么在java中关闭一个thread我们经常需要在java中用到thread#xff0c;我们知道thread有一个start()方法可以开启一个线程。那么怎么关闭这个线程呢#xff1f;有人会说可以用Thread.stop()方法。但是这个方法已经被废弃了。根据Oracle的官方文档#xff0c;Thread.stop是不…怎么在java中关闭一个thread我们经常需要在java中用到thread我们知道thread有一个start()方法可以开启一个线程。那么怎么关闭这个线程呢有人会说可以用Thread.stop()方法。但是这个方法已经被废弃了。根据Oracle的官方文档Thread.stop是不安全的。因为调用stop方法的时候将会释放它获取的所有监视器锁(通过传递ThreadDeath异常实现)。如果有资源该监视器锁所保护的话就可能会出现数据不一致的异常。并且这种异常很难被发现。 所以现在已经不推荐是用Thread.stop方法了。那我们还有两种方式来关闭一个Thread。Flag变量如果我们有一个无法自动停止的Thread我们可以创建一个条件变量通过不断判断该变量的值来决定是否结束该线程的运行。public class KillThread implements Runnable {private Thread worker;private final AtomicBoolean running new AtomicBoolean(false);private int interval;public KillThread(int sleepInterval) {interval sleepInterval;}public void start() {worker new Thread(this);worker.start();}public void stop() {running.set(false);}public void run() {running.set(true);while (running.get()) {try {Thread.sleep(interval);} catch (InterruptedException e){Thread.currentThread().interrupt();log.info(Thread was interrupted, Failed to complete operation);}// do something here}log.info(finished);}public static void main(String[] args) {KillThread killThread new KillThread(1000);killThread.start();killThread.stop();}}上面的例子中我们通过定义一个AtomicBoolean 的原子变量来存储Flag标志。我们将会在后面的文章中详细的讲解原子变量。调用interrupt()方法通过调用interrupt()方法将会中断正在等待的线程并抛出InterruptedException异常。根据Oracle的说明如果你想自己处理这个异常的话需要reasserts出去注意这里是reasserts而不是rethrows因为有些情况下无法rethrow这个异常我们需要这样做Thread.currentThread().interrupt();这将会reasserts InterruptedException异常。看下我们第二种方法怎么调用public class KillThread implements Runnable {private Thread worker;private final AtomicBoolean running new AtomicBoolean(false);private int interval;public KillThread(int sleepInterval) {interval sleepInterval;}public void start() {worker new Thread(this);worker.start();}public void interrupt() {running.set(false);worker.interrupt();}public void stop() {running.set(false);}public void run() {running.set(true);while (running.get()) {try {Thread.sleep(interval);} catch (InterruptedException e){Thread.currentThread().interrupt();log.info(Thread was interrupted, Failed to complete operation);}// do something here}log.info(finished);}public static void main(String[] args) {KillThread killThread new KillThread(1000);killThread.start();killThread.interrupt();}}上面的例子中当线程在Sleep中时调用了interrupt方法sleep会退出并且抛出InterruptedException异常。