java多线程启动线程调用start()方法,停止线程使用stop()方法。嗯,停止线程就是这么简单,但是现在stop()方法已经被标记过时了。
@Deprecated
public final void stop() {
SecurityManager security = System.getSecurityManager();
不止是stop()方法,还有许多,例如resume(), suspend()等方法都过时了,搜索文章 Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 可以了解这些方法过时的原因。
正确停止一个线程涉及到了3个方法,分别是 interrupt(), interrupted(), isInterrupted()。其中,interrupt()是停止线程的方法,interrupted()和 isInterrupted()两个返回布尔值的方法。
线程对象调用interrupt()方法之后,并没有真正的停止,而是打上了一个标记,可以改变interrupted()和 isInterrupted()的返回值。那么,interrupted()和 isInterrupted()有什么区别呢?看源码可以知道,interrupted()是一个静态方法,用来判断当前线程(注意不一定是调用interrupted()方法的线程)是否打上了标记,isInterrupted()用于判断调用该方法的线程对象是否打上了标记。并且还可以看到,这两个方法都调用了一个native的私有方法isInterrupted, 里面有个形参ClearInterrupted,注释的意思是是否清除标记。通过代码尝试,得知了interrupted()方法具有清除标记的功能,而isInterrupted()方法没有,清除标记的功能是指,线程被打上停止标记后,第一次调用interrupted()方法会返回true,第二次则会清除标记,从而返回false。
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
public boolean isInterrupted() {
return isInterrupted(false);
}
/**
* Tests if some Thread has been interrupted. The interrupted state
* is reset or not based on the value of ClearInterrupted that is
* passed.
*/
private native boolean isInterrupted(boolean ClearInterrupted);
这样,我们就知道了如何正确的在一个线程中停止另外一个线程。就是在一个线程中,将要停止的线程调用interrupt()方法,然后在线程代码中使用interrupted()和 isInterrupted()判断是否为true来决定。
那如何在一个线程中停止当前线程呢?直接让run方法走完不就可以了嘛。