zoukankan      html  css  js  c++  java
  • 【JAVA并发编程实战】6、中断

    所谓的中断操作:它并不会真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己。

    调用一次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();
        }
    }
  • 相关阅读:
    bzoj 1497: [NOI2006]最大获利
    bzoj 2733: [HNOI2012]永无乡
    [CF911G]Mass Change Queries
    [CF911F]Tree Destruction
    [CF911E]Stack Sorting
    [CF911D]Inversion Counting
    [CF911C]Three Garlands
    [CF911B]Two Cakes
    [CF911A]Nearest Minimums
    [POJ1201]Intervals
  • 原文地址:https://www.cnblogs.com/cutter-point/p/6029520.html
Copyright © 2011-2022 走看看