Java线程中 stop和interrupt方法的区别

主动终止Java线程有两种方式,第一个是调用Java线程的stop方法,该方法由于不安全已经被弃用;第二个是调用interrupt方法。

  • Java线程中的stop()方法已经弃用,究其原因是stop()方法不安全。stop方法终止当前线程所有未结束的方法,包括run 方法,当线程被终止,立即释放被它锁住的所有对象的锁。这会导致对象处于不一致的状态。锁的本质是防止线程竞争,保持状态的一致性。

    有很多误解,stop方法之所以被弃用是因为该方法执行以后,当前线程不会释放锁对象,从而导致死锁。这个说法是错误的。

public class StopTest {
    public static void main(String[] args) throws InterruptedException {
        PrintThread aa = new PrintThread("aa");
        PrintThread bb = new PrintThread("bb");
        aa.start();
        Thread.sleep(1000);
        aa.stop();
        bb.start();
        System.out.println();
    }
}
class PrintThread extends Thread {
    String msg;
    public PrintThread(String msg) {
        this.msg = msg;
    }
    @Override
    public void run() {
        try {
            synchronized (PrintThread.class) {
                System.out.println(msg);
                System.out.println(Thread.currentThread().getName());
                Thread.sleep(5000);
                System.out.println(msg + "end");
            }
        }catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

代码参考 pluto 所写,自己的代码功夫得好好练练
执行结果如图

  • Java 中的 interrupt 方法则是仅仅通知线程,线程有机会执行一些后续操作,同时也可以无视这个通知。一般通过异常和主动检测通知将被中断的线程。
    当对一个线程调用 interrupt 方法时,线程的中断状态将被置位。
  1. 异常通知
    1. 当线程处于 WAITING、TIMED_WAITING状态(线程调用wait、join、sleep)时,如果其他线程调用线程 A 的 interrupt 方法时,会使线程 A 返回到 RUNNABLE 状态,同时线程 A 会出发 InterruptedException。
    2. 当线程 A 处于 RUNNABLE状态时,并且阻塞在java.nio.channels.InterruptibleChannel上时,如果其他线程调用线程 A 的 interrupt 方法时,线程 A 会触发java.nio.channels.ClosedByInterruptedException。如果阻塞在java.nio.channels.Selector 上时,线程 A 的java.nio.channels.Selector会立即返回。
  2. 当线程 A 处于 RUNNABLE状态时,并且没有阻塞在某个 I/O 状态,这个时候就依赖线程 A 主动检测状态位,通过调用 isInterrupted 方法,检测自己是否被中断。

发表评论

电子邮件地址不会被公开。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部