线程是指进程中的一个执行流程,一个进程中可以运行多个线程。并且Java线程有创建启动就有停止,那java线程怎么停止?下面我们给大家分享一些java线程停止方法,希望给大家带来一些参考!
1:异常法停止
线程调用interrupt()方法后,在线程的run方法中判断当前对象的interrupted()状态,如果是中断状态则抛出异常,达到中断线程的效果。
如下示例:
MyThread.java
public class MyThread extends Thread { @Override public void run() { try { for (int i = 0; i < 500000; i++) { if (MyThread.interrupted()) { System.out.println("已经是停止状态了,我要退出了!"); throw new InterruptedException(); } System.out.println("i = " + (i + 1)); } System.out.println("如果我被输出了,则代表线程没有停止"); } catch (InterruptedException e) { System.out.println("在MyThread类中的run方法中被捕获"); e.printStackTrace(); } } }
Main.java
/** * 根据中断状态退出for循环 * @Author: xjf * @Date: 2019/5/25 13:27 */ public class Main { public static void main(String[] args) { try { MyThread myThread = new MyThread(); myThread.start(); Thread.sleep(100); myThread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("end!"); } }
结果如下:
i = 19115 i = 19116 i = 19117 i = 19118 i = 19119 end!
已经是停止状态了,我要退出了!
在MyThread类中的run方法中被捕获
java.lang.InterruptedException
at com.book.interrupt_exit.MyThread.run(MyThread.java:15)
Process finished with exit code 0
2.stop()暴力停止
线程调用stop()方法会被暴力停止,方法已弃用。该方法会有不好的后果:
(1)强制让线程停止有可能使一些请理性的工作得不到完成。
(2)对锁定的对象进行了“解锁”,导致数据得不到同步的处理,出现数据不一致的问题(比如一个方法加上了synchronized,并在其中进行了一个长时间的处理,而在处理结束之前该线程进行了stop(),则未完成的数据将没有进行到同步的处理)
3.使用return停止线程
调用interrupt标记为中断状态后,在run方法中判断当前线程状态,如果为中断状态则return,能达到停止线程的效果。
备注:建议使用“抛异常”的方法来实现线程的停止,因为在catch块中还可以将异常向上抛,使线程停止的事件得以传播。
4. 使用interrupt方法终止线程
使用interrupt方法来终端线程可分为两种情况:
(1)线程处于阻塞状态,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}来判断线程是否被中断。
在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。
package chapter2; public class ThreadInterrupt extends Thread { public void run() { try { sleep(50000); // 延迟50秒 } catch (InterruptedException e) { System.out.println(e.getMessage()); } } public static void main(String[] args) throws Exception { Thread thread = new ThreadInterrupt(); thread.start(); System.out.println("在50秒之内按任意键中断线程!"); System.in.read(); thread.interrupt(); thread.join(); System.out.println("线程已经退出!"); } }
上面代码的运行结果如下:
在50秒之内按任意键中断线程!
sleep interrupted
线程已经退出!
Java线程停止就是利用以上这4种方法,当然我们在让线程停止的时候,也要注意线程停止方法,避免带来一些安全隐患!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: