Java终止线程的方法
1. 抛异常
该方法让线程抛出Error的子异常ThreadDeath异常来暴力终止线程,ThreadDeath继承于Error。
如果想要调用stop方法又想要料理线程后事,可以在run方法代码块中捕获ThreadDeath或Error或Throwable异常,在catch方法中处理后事。
注意在catch中考虑重新抛出异常来终止线程,不这样做视情况可能会变成线程救援(如在循环中捕获并处理)。
线程救援示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class TimeThread extends Thread { @Override public void run() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); while (true) { try { simpleDateFormat.format(new Date()); } catch (ThreadDeath e) { System.out.println("线程救援..."); } } } }
|
另外一提,JDK不建议使用该方法,原因是抛出异常将会解除该线程所持有的monitor监视器,造成线程安全隐患(monitor是Java的Synchronized关键字实现的重要对象)。
2. Thread实例对象的interrupt()方法
该方法类似于设置线程状态,设置线程为中断状态。如果线程处于调用wait、sleep、join时,会将中断状态清除并抛出InterruptedException异常(从名字上可知继承于Exception),捕获异常进行相关处理最后return来停止线程。
如果线程处于循环时,这个方法似乎起不了作用,其实可以在循环的第一行进行判断,判断当前线程并调用isInterrupted()方法获取线程是否被设置为中断状态。
循环处理示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class TimeThread extends Thread { @Override public void run() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); while (true) { if (Thread.currentThread().isInterrupted()){ break; } simpleDateFormat.format(new Date()); } } }
|
3. 设置中断标志
设置相关属性,在代码中进行判断是否需要停止。
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class TimeThread extends Thread { public static volatile boolean flag = false; @Override public void run() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); while (true) { if (flag){ break; } simpleDateFormat.format(new Date()); } } }
|