The so-called interrupt operation: It does not actually interrupt a running thread, but only issues an interrupt request, and then the thread interrupts itself at the next appropriate moment.
Call the interrupt interrupt request once, and call it again to restore the interrupt status
1. Respond to the interrupt
Handle the interrupt exception:
1》Transmit the exception
2》Restore the interrupt status
Here is an example, use To run tasks within a limited time, within the specified time, regardless of whether the program responds to the interrupt and terminates the program, or does not respond to the interrupt, we can get the result by calling this method,
that is, we can get the processing within the specified time The result and how to deal with the result can be defined by yourself
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(); } }