这两天看到好几个关于可中断线程的代码分享,手痒痒,因而也写一个玩玩。 java
package misty.thread.interruptable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; public class InterruptableThreadTest { public static class Task implements Runnable { @Override public void run() { try { while (!Thread.currentThread().isInterrupted()) { // Thread.interrupted()也能够检查中断状态是否被设置,可是它同时会清除中断状态。而isInterrupted不会。 // 处理业务逻辑 System.out.println("业务逻辑必须是可异步中断的"); // 例如sleep就是可异步中断的 TimeUnit.SECONDS.sleep(1); } } catch (InterruptedException e) { // 捕获InterruptedException会清除中断状态 // 若是这个任务是在线程池中执行的,那么应该将中断状态置回 Thread.currentThread().interrupt(); } // 线程结束 System.out.println("个人使命完成了"); } } /** * @param args * @throws InterruptedException * @throws ExecutionException */ public static void main(String[] args) throws InterruptedException, ExecutionException { // 方法1 Thread t = new Thread(new Task()); t.start(); TimeUnit.SECONDS.sleep(5); t.interrupt(); t.join(); // 方法2 ExecutorService exec = Executors.newCachedThreadPool(); Future<?> future = exec.submit(new Task()); TimeUnit.SECONDS.sleep(5); future.cancel(true); // 方法3 FutureTask<?> futureTask = new FutureTask<Void>(new Task(), null); exec.execute(futureTask); TimeUnit.SECONDS.sleep(5); futureTask.cancel(true); // 其实不管是哪一种,本质上都是Thread#interrupt exec.shutdown(); exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); } }固然这是最简单的模拟。要想真正设计一个支持异步中断的任务须要考虑不少问题。好比如何将一个大任务分解成若干小任务、任务在什么位置容许中断、必须用支持异步中断的NIO来替换阻塞式的IO和Socket等。