线程的取消和关闭

最近在总结multithread方面的知识。这篇主要介绍线程的取消。

在任务、线程、服务以及应用程序等模块中的生命周期结束问题,可能会增加他们在设计和实现时的复杂性。Java并没有提供某种抢占式的机制来取消操作或者终结线程。相反,它提供了一种协作式的中断机制来实现实现取消操作,但这要依赖于如何构建取消操作的协议,以及能否遵循这些协议。通过使用FutureTask和Executor框架,可以帮助我们构建可取消的任务和服务。

ExecutorService.submit 将返回一个Future来描述任务,future拥有一个cancel方法,该方法带有一个boolean类型的参数mayInterruptIfRunning,表示操作是否成功,(这只表示任务能否接受中断,而不是表示任务能否检测并处理中断)如果mayInterruptIfRunning为true并且任务正在某个线程中运行,那么这个线程能被中断。如果为false,那么表示 若任务还没有启动,就不要启动它, 这种方式应该用于那些不处理中断的任务中。

除非你清楚线程的中断策略,否则不要中断线程,那么什么时候可以指定cancel的参数为true?执行任务的线程是由标准的Executor创建的,它体现了一种中断策略使得任务可以通过中断被取消,所以如果任务在Executor中运行,并通过他们的Future取消任务,那么可以设置mayInterruptIfRunning。当尝试取消某个任务时,不宜直接中断线程池,因为你并不知道当中断请求到达时正在运行什么任务--只能通过任务的future来实现取消。

1.通过Future实现取消

Future<?> task = executor.submit(r);

try{

task.get(timeout,timeunit);

}catch(TimeoutException to){

//接下来任务将被取消

}catch(ExecutionException eo){

//如果任务中抛出了异常,那么重新抛出异常

throw launderThrowable(eo.getCause());

}finally{

task.cancel(true);//如果任务已经结束,那么取消操作也不会带来任何影响;如果任务正在运行,那么将被中断

}

时间: 2024-12-17 08:37:48

线程的取消和关闭的相关文章

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

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

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

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

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

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

[Java Concurrency in Practice]第七章 取消与关闭

取消与关闭 要使任务和线程能安全.快速.可靠地停止下来,并不是一件容易的事.Java没有提供任何机制来安全地终止线程(虽然Thread.stop和suspend方法提供了这样的机制,但由于存在缺陷,因此应该避免使用).但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作. 这种协作式的方法是必要的,我们很少希望某个任务.线程或服务立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态.相反,在编写任务和服务时可以使用一种协作的方式:当需要停止时,它们首先会清除当前正在执

《Java并发编程实战》第七章 取消与关闭 读书笔记

Java没有提供不论什么机制来安全地(抢占式方法)终止线程,尽管Thread.stop和suspend等方法提供了这种机制,可是因为存在着一些严重的缺陷,因此应该避免使用. 但它提供了中断Interruption机制,这是一种协作机制,可以使一个线程终止还有一个线程的当前工作. 一.任务取消 取消操作的原因: . 用户请求取消 . 有时间限制的操作 . 应用程序事件 . 错误 . 关闭 结束任务的四种方式: 1. run方法运行结束 2. 使用请求关闭标记(比如boolean开关) 3. 使用中

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并发编程实战:第七章----取消与关闭

Java没有提供任何机制来安全地终止线程(虽然Thread.stop和suspend方法提供了这样的机制,但由于存在缺陷,因此应该避免使用 中断:一种协作机制,能够使一个线程终止另一个线程的当前工作 立即停止会使共享的数据结构处于不一致的状态,需要停止时,发出中断请求,被要求中断的线程处理完他当前的任务后会自己判断是否停下来 一.任务取消 若外部代码能在某个操作正常完成之前将其置入"完成"状态,则还操作是可取消的.(用户请求取消.有时间限制的操作<并发查找结果,一个线程找到后可取

线程学习第二课--脱离线程,调度线程,取消线程,多线程

例如主线程继续为用户提供服务的同时创建第二个线程这个线程的作用是将用户正在编辑的数据进行备份存储那么备份结束之后第二个线程就可以字节终止没必要再回到主线程中区 称这样的线程为脱离线程,可以通过修改属性或者调用pthread_detach的方法来创建这里我们从属性的角度研究脱离线程 1 #include <pthread.h> 2 int pthread_atte_init(pthread_attr_t * attr); 函数的作用是初始化一个线程属性对象 对应的回收函数是pthread_att