stop()方法在现在JDK中不推荐使用,原因是stop()方法过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题
在使用线程中,如果需要中断线程,不建议使用在线程内部定义一个Boolean 然后在外边改变它的值的方式。
因为这种方式,如果线程中存在 wait或者sleep等 会被操作系统挂起的方法,即使在外部改变了Boolean的值,线程也不会感知到。
如果有这种需求建议使用线程的interrupted 方法,然后在线程内部调用 isInterrupted判断是否被中断。
isInterrupted有两个方法,一个是isInterrupted方法,这种的不会将interrupted 的值重置为false
还有一种是静态的Thread.interrupted方法,这种的会将interrupted 的值重置为false
public static void main(String[] args) throws InterruptedException { MyThread myThread = new MyThread(); myThread.start(); Thread.sleep(5000); myThread.interrupt(); } private static class MyThread extends Thread { @Override public void run() { String threadName = Thread.currentThread().getName(); System.out.println("1 interrupt is" + isInterrupted()); while (!Thread.interrupted()) { try { Thread.sleep(1000); } catch (InterruptedException e) { /** * 如果线程处于挂起状态时收到了interrupt信号,会抛出一个InterruptedException异常, * 并且重置interrupt,此时我们在捕获这个异常之后可以手动的设置interrupt,从而使得 * 下次循环时判断到已经被中断了,退出线程。 * 这样的好处是,不会像调用stop一样,直接中断,导致线程中中断位置之后的代码得不到 * 运行,而导致的结果跟预期不一样。 */ interrupt(); e.printStackTrace(); } System.out.println("2 interrupt is" + isInterrupted()); } } }
如果用的不是extends Thread 方式创建线程,而是使用的implements Runable方式,可以使用
Thread.currentThread().sInterrupted()代替。