并发编程:取消与关闭

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启动时创建的所有线程中,除了主线程,其他的线程都是守护线程

时间: 2024-10-09 13:49:55

并发编程:取消与关闭的相关文章

JAVA并发编程9_正确关闭线程

Java没有提供任何的安全机制来终止线程,程,虽然Thread.stop和suspend等方法提供了这样的机制,但是存在严重的缺陷,应该避免使用这些方法. 它提供了中断(interrupt),这是一种协作机制,能够使一个线程终止另一个线程当前的工作. 一种协作机制是设置一个"已请求取消(Cancellation Requested)"标志,而任务定期查看该标志. "已请求取消"标志 private volatile boolean cancelled; public

并发编程 09—— 任务取消 之 关闭 ExecutorService

Java并发编程实践 目录 并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线

java并发编程6.取消与关闭

如果外部代码能在某个操作正常完成之前将其置入"完成"状态,那么这个操作就可以称为可取消的. Java没有提供任何机制来安全地终止线程.但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作. 其中一种协作机制能设置某个"已请求取消"的标志,而任务将定期地查看该标志,如果设置了这个标志,那么任务将提前结束. 自定义取消机制 /** * 素数生成器 */ private class PrimeGenerator implements Runnable{

并发编程 11—— 任务取消与关闭 之 shutdownNow 的局限性

Java并发编程实践 目录 并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线

java并发编程实战学习笔记之取消与关闭

第七章 取消与关闭 7.1 任务取消 方式一.通过volatile类型的域来保存取消状态 方式二.interrupt()方法 interrupt()可以中断目标线程 isinterrupted()方法用来检测目标线程的中断状态 interrupted()用于清除中断状态,并且返回之前的中断状态,这是唯一可以清除中断状态的方法,如果在调用该方法是返回了true,那么除非你想屏蔽这个中断,否则你必须对他进行处理,可以抛出interruptExeption异常或者重新通过interrupt来恢复中断状

并发编程003 --- 线程的取消与关闭

要使线程安全.快速.可靠的停下来并非易事,java并未提供机制保证线程安全的停止,但是我们可以通过使用中断来完成线程的停止和关闭: 本章节只总结基础线程的取消和关闭,类似封装库提供的方法如Future.线程池不在本章节讨论. 1.interrupted方法 Thread提供了中断相关的方法,这里需要注意的一点是,使用静态的interrupted方法,会清除线程的中断状态. 2.利用volatile变量作为标记,实现线程的关闭,前提是当前线程调用BlockingQ的produce方法,不会进入等待

并发编程—— 任务取消 之 停止基于线程的服务

Java并发编程实践 目录 并发编程—— ConcurrentHashMap 并发编程—— 阻塞队列和生产者-消费者模式 并发编程—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程—— Callable和Future 并发编程—— CompletionService : Executor 和 BlockingQueue 并发编程—— 任务取消 并发编程—— 任务取消 之 中断 并发编程—— 任务取消 之 停止基于线程的服务 概述 第1 部分 问题描述 第2 部分

Java 并发编程之任务取消(九)

Jvm关闭 jvm可正常关闭也可强行关闭,正常关闭有多种触发方式: 当最后一个正常(非守护,下面会讲到什么是守护线程)线程结束时 当调用system.exit时,或者通过其他特定于平台的方法关闭时(例如发送了SIGINT信号或键入Ctrl-c) 通过其他特定平台的方法关闭jvm,调用Runtime.halt或者在操作系统当中杀死JVM进程(例如发送sigkill)来强行关闭jvm. 关闭钩子 在正常关闭中,jvm首先调用所有已注册的关闭钩子,关闭钩子是指通过 Runtime.addShutdow

Java 并发编程之任务取消(八)

处理非正常的线程中止 当单线程的控制台程序由于 发生了一个未捕获的异常而终止时,程序将停止运行,并产生与程序正常输出非常不同的栈追踪信息,这种情况是很容易理解的.然而,如果并发程序中的某个线程发生故障,那么通常不会如此明显.在控制台中可能会输出栈追踪信息,但没有人会观察控制台.此外,当线程发生故障时,应用程序可能看起来仍然 在工作,所以这个失败很可能被忽略.下面要讲的问题就是监测并防止在程序中"遗漏"线程的方法 . 导致线程提前死亡的最主要原因就是RuntimeException. 我

并发编程—— 任务取消

Java并发编程实践 目录 并发编程—— ConcurrentHashMap 并发编程—— 阻塞队列和生产者-消费者模式 并发编程—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程—— Callable和Future 并发编程—— CompletionService : Executor 和 BlockingQueue