首页 > 代码库 > 并发编程:取消与关闭

并发编程:取消与关闭

1、取消标志:任务可能永远不会检查取消标志,如BlockingQueue.put阻塞操作

2、中断

  1)它并不是真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己

  2)中断是实现取消的最合理方式

  3)除非你知道中断该线程的含义,否则就不应该中断这个线程

  4)中断策略:尽快退出执行流程

4、响应中断

  1)传递异常

  2)恢复中断状态(再次调用interrupt)

  注:只有实现了线程中断策略的代码才可以屏蔽中断请求

5、在专门的线程中中断任务:RethrowableTask是主线程,r是子线程,t在两线程中共享

    class RethrowableTask implements Runnable {
        private volatile Throwable t;
        public void run() {
            try {
                r.run();
            } catch(Throwable e) {
                this.t = e
            }
        }
        
        public void rethrow() {
            if(t != null) {
                throw launderThrowable(t)
            }
        }
    }

6、非标准取消操作

  1)处理不可中断的阻塞:改写写interrupt();

  

    public void interrupt() {
        try {
            socket.close();
        } catch(IOException e) {
        } finally {
            super.interrupt();
        }
    }

  2)采用newTaskFor来封装非标准的取消:click


7、使用ExecutorService的可停止日志服务

  1)使用SingleThreadExecutor

  2)stop方法调用 exec.shutdown;exec.awaitTermination

8、爬虫:通过判断isShutdown(),保存中断状态

9、未捕获异常的处理

    public class UEHLogger implements Thread.UncaughtExceptionHandler {
        public void uncaughtException(Thread t, Throwable e) {
            logger.log(t.getName, e)
        }
    }

10、关闭钩子:用户实现服务或应用程序的清理工作,如删除临时文件或清除无法有系统自动清除的资源

11、守护线程:JVM启动时创建的所有线程中,除了主线程,其他的线程都是守护线程

并发编程:取消与关闭