安全的终止线程

安全的终止线程

如果想终止线程最好不要使用 stop 方法,因为 stop 方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。

终止线程最好使用线程中断标识 isInterrupt 或者自定义一个 boolean 变量来控制是否需要停止任务并终止该线程。

Shutdown.java

import java.util.concurrent.TimeUnit;

/**
 * 使用标识安全的终止线程
 */
public class Shutdown {
    public static void main(String[] args) throws InterruptedException {
        Runner one = new Runner();
        Thread countThread = new Thread(one, "CountThread");
        countThread.start();
        TimeUnit.SECONDS.sleep(1);
        countThread.interrupt();
        Runner two = new Runner();
        countThread = new Thread(two, "CountThread");
        countThread.start();
        TimeUnit.SECONDS.sleep(1);
        two.cancel();
    }

    private static class Runner implements Runnable {
        private long i;
        private volatile boolean on = true;

        /**
         * 通过线程中断标志位或则一个 boolean 变量来取消或者停止任务
         */
        @Override
        public void run() {
            while (on && !Thread.currentThread().isInterrupted()) {
                i++;
            }
            // 清理资源
            System.out.println("Count = " + i);
        }

        public void cancel() {
            on = false;
        }
    }
}

你可能感兴趣的:(安全的终止线程)