1 package cn.pancc.purejdk.concurrent; 2 3 import lombok.SneakyThrows; 4 5 import java.util.concurrent.TimeUnit; 6 7 /** 8 * @author pancc 9 * @version 1.0 10 */ 11 public class StoppableRunner implements Runnable { 12 13 private volatile boolean sta = true; 14 15 /** 16 * {@link Thread#currentThread} 返回实际执行 Runnable 的虚拟机线程引用 . 17 * <p> 18 * {@link Thread#isInterrupted()} 每次调用都会清除标志位,设置为 false . 19 * <p> 20 * {@link Thread#interrupt} 会将标志位设置为 true . 21 * <p> 22 * {@link Thread#sleep} 方法同样也会清除标志位,设置为 false,因此当线程中存在 sleep 时, 23 * 单使用 !Thread.currentThread().isInterrupted() 将不可用; 24 * 当 {@link Thread#interrupt} 被调用,尝试 sleep 将会抛出 {@link InterruptedException}, 25 * <p> 26 */ 27 @SneakyThrows 28 @Override 29 public void run() { 30 31 int count = 0; 32 while (!Thread.currentThread().isInterrupted() && sta) { 33 System.out.println(count++); 34 TimeUnit.SECONDS.sleep(1); 35 36 } 37 } 38 39 public void cancel() { 40 this.sta = false; 41 } 42 43 public static void main(String[] args) throws InterruptedException { 44 StoppableRunner runner = new StoppableRunner(); 45 Thread t = new Thread(runner); 46 t.start(); 47 TimeUnit.SECONDS.sleep(4); 48 // thread.cancel(); 49 t.interrupt(); 50 51 } 52 }