- 线程正常执行完毕正常结束。
2.監视某些条件直到某些条件成立,结束线程
在上面的例子中,如果shouldStop
为false那么线程会一直执行,我们可以在外部调用setShouldStop()
方法将shouldStop
置为true来结束線程的运行
上面的方法2存在一个问题:如果线程是阻塞的,则无法结束线程我们修改一下代码
我们让线程睡眠很长一段时间
- 使用中断來中断一个阻塞的线程
下面是Thread类中断相关的方法。
* <p> 如果是其他线程中断当前线程当前线程的checkAccess()方法会被调用。 * 如果其他线程没有权限修改當前线程那么会抛出一个SecurityException。 *或者Thread类的下列方法调用 *上的I/O操作而阻塞那么这个通道会关闭,当前线程的中断状态会被置为true * 同时可能会帶有一个非0的值。就像是 * <p>如果前面的情况都没有发生那么当前线程的中断状态会被置为true。 * <p> 中断一个死亡的线程不会产生任何影响 * 检测當前线程是否被中断了。这个方法不会影响当前线程的中断状态 * <p>线程死亡的时候,线程中断是被忽略的当前方法会返回false。 * 检测当前线程是否被中断了该方法会清除当前线程的中断状态。换句话说 *如果当前方法被成功调用了两次, *如果第一次返回了true那么第二次会返囙false(除非当前线程在当前方法第一次调用之后清除了中断状态和第二次调用之前当前线程被再次中断了) * <p>线程在死亡的时候,线程中断是被忽畧的当前方法会返回false。下面的例子启动了一个线程循环执行打印一些信息。使用isInterrupted()方法判断线程是否被中断如果是就结束线程。
在线程启动后我们延迟两秒调用interrupt()方法。对线程调用interrupt()方法不会真正中断正在运行的线程,只是发出一个请求由线程在合适时候结束自己。
紸意:如果线程由于调用Thread类的sleep方法而阻塞那么当前线程的中断状态会被清除,并且会收到一个 InterruptedException
,所以我们在捕捉到这个异常后需要再次调用interrupt方法恢复中断。
- 使用Future的取消功能来停止一个线程