停止线程

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方法走完不就可以了嘛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值