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);
}
}
可中断线程
猜你喜欢
转载自m635674608.iteye.com/blog/2309715
今日推荐
周排行