소위 인터럽트 작업: 실제로 실행 중인 스레드를 인터럽트하지 않고 인터럽트 요청만 발행한 후 스레드가 다음 적절한 순간에 스스로 인터럽트합니다.
인터럽트 요청을 한 번 호출하고 다시 호출하여 인터럽트 상태를 복원합니다.
1. 인터럽트에 응답합니다.
인터럽트 예외를 처리합니다.
1>전송 예외
2>중단된 상태를 복원
프로그램의 응답 여부에 따라 제한된 시간 내에 작업을 실행하는 예입니다. 인터럽트가 발생하면 이 메소드를 호출하여 결과를 얻을 수 있습니다.
는 지정된 시간 내에 처리 결과를 얻을 수 있다는 의미입니다. 결과는 스스로 정의할 수 있습니다
package cn.study.concurrency; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * * @author xiaof * */ public class TimeCount { private static final ScheduledExecutorService cancelExec = Executors.newSingleThreadScheduledExecutor(); /** * * @param r 线程 * @param timeout 任务超时限定 * @param unit 时间单元 * @throws Throwable */ public static void timedRun(final Runnable r, long timeout, TimeUnit unit) throws Throwable { class RethrowableTask implements Runnable { //抛出的异常 private volatile Throwable t; @Override public void run() { try { r.run(); } catch (Throwable e) { this.t = e; } } /** * 当运行超时,或者程序运行正常退出的时候,后面进行控制的时候调用这个返回给调用者 * @throws Throwable */ void rethrow() throws Throwable { //这个t可以自己包装,或者返回其他数据,这个可以根据不同的业务来定 //这里甚至可以保持当前状态到本地,在下次运行的时候,先读取本地数据,恢复到当前状态,留到以后操作 if(t != null) throw t; } } RethrowableTask task = new RethrowableTask(); final Thread taskThread = new Thread(task); taskThread.start(); //启动外部线程 cancelExec.schedule(new Runnable() { public void run() { //启动中断异常 taskThread.interrupt(); } }, timeout, unit); //等待线程的终止,用来应对即使任务不响应中断,限定时间一到,最后仍可以抛出异常到这个方法的调用者 taskThread.join(unit.toMillis(timeout)); //抛出异常 task.rethrow(); } }