欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  类库下载

JAVA并发编程中断

程序员文章站 2022-03-06 16:52:15
...
所谓的中断操作:它并不会真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己。

调用一次interrupt中断请求,再次调用就是把中断状态恢复

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();
    }
}
相关标签: JAVA