Java如何停止线程运行

在 Thread 类中有如下几个方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public void interrupt() {
        if (this != Thread.currentThread()) {
            checkAccess();

            // thread may be blocked in an I/O operation
            synchronized (blockerLock) {
                Interruptible b = blocker;
                if (b != null) {
                    interrupt0();  // set interrupt status
                    b.interrupt(this);
                    return;
                }
            }
        }

        // set interrupt status
        interrupt0();
    }

private native void interrupt0();
private native void stop0(Object o);
private native void start0();
  • 异常法停止

线程调用 interrupt()后,在线程的 run 方法中判断当前对象的 interrupted()状态,如果是中断状态则抛出异常,达到中断线程的效果。

  • 在沉睡中停止

先将线程 sleep,然后调用 interrupt 标记中断状态,interrupt 会将阻塞状态的线程中断。会抛出中断异常,达到停止线程的效果。

  • stop0 暴力停止

线程调用 stop0 方法会被暴力停止,方法已弃用,该方法会有不好的后果:强制让线程停止有可能使一些请理性的工作得不到完成。

  • return 停止线程

调用 interrupt 标记为中断状态后,在 run 方法中判断当前线程状态,如果为中断状态则 return,能达到停止线程的效果。

调用 interrupt 如何让线程抛异常

每个线程都一个与之关联的布尔属性来表示其中断状态,中断状态的初始值为 false,当一个线程被其它线程调用 Thread.interrupt()方法中断时,会根据实际情况做出响应:

  • 如果该线程正在执行低级别的可中断方法如 Thread.sleep()、Thread.join()或 Object.wait(),则会解除阻塞并抛出 InterruptedException 异常。
  • 否则 Thread.interrupt()仅设置线程的中断状态,在该被中断的线程中稍后可通过轮询中断状态来决定是否要停止当前正在执行的任务。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计