首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java并发编程:任务的取消和关闭

要使任务和线程能安全、快速、可靠地停止下来,并不是一件容易的事。Java 没有提供任何机制来安全的终止线程。但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。...取消任务的方式有哪几种 取消任务的方式大体上有一下两种: 设置取消标志位 中断 设置取消标志位 设置某个“已请求取消”标志,而任务将定期地查看该标志。如果设置了这个标记,那么任务将提前结束。...一个可取消的任务必须拥有取消策略,在这个策略中将详细地定义取消操作的“How”、“When”以及“What”,即其他代码如何(How)请求取消该任务,任务在何时(When)检查是否已经请求了取消,以及在响应取消请求时应该执行哪些...在 Java 的 API 或语言规范中,并没有将中断与任何取消语义关联起来,但实际上,如果在取消之外的其他操作中使用中断,那么都是不合适的,并且很难支撑起更大的应用。...任务不应该对执行该任务的线程的中断策略做出任何假设,除非该任务被专门设计为在服务中运行,并且在这些服务中心包含特定的中断策略。

1.3K20

Java并发之工具类 ForkJoin 任务分解

Fork/Join框架的介绍 第一步分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小。 第二步执行任务并合并结果。...分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。...当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务。...package com.thread.test.thread; import java.io.File; import java.util.ArrayList; import java.util.List...; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; /** * Created

58520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    探索JAVA并发 - 如何优雅地取消线程任务

    通过线程启动一个异步的任务很容易,但想让它提前安全且快速地结束确并不简单。如果线程外部的代码可以提前把目标线程置为“完成”状态,那么这个目标线程就是可取消的。...线程任务取消的原因一般有如下几种: 用户请求取消: 比如用户发起一个耗时操作后,不想等了,就点击了取消按钮,此时我们应该把还在执行的任务叫停; 时间限制: 某些流程可能很费时,我们要控制等待时间,当超时后需要取消掉任务...取消标志 一种常用的方法是在任务代码中加入一个“是否取消”的标志,任务定期去查看这个标志是否改变,如果被改变了就取消剩下的任务,此时如果想取消这个任务只需要修改它的标志,然后安静地等待其退出即可。...中断 线程中断是一种协作机制,通过这个机制通知某个线程,让它可以在合适的或可能的情况下停止任务。那么什么是合适/可能的情况呢?...private native boolean isInterrupted(boolean ClearInterrupted); } 调用中断方法 interrupt() 并不会让目标线程立即停止任务

    3.2K30

    Java并发编程:任务执行器Executor接口​

    任务执行器(Executor)是一个接口,位于java.util.concurrent包下,它的作用主要是为我们提供任务与执行机制(包括线程使用和调度细节)之间的解耦。...比如我们定义了一个任务,我们是通过线程池来执行该任务,还是直接创线程来执行该任务呢?通过Executor就能为任务提供不同的执行机制。...02 一对一执行器 一对一执行器就是一个任务由一个线程负责,每个任务提交给执行器时都将创建一个新的线程来执行该任务。...而execute方法则是将任务添加到任务队列中,然后工作线程会执行任务队列中的任务。 ?...SerialExecutor的execute方法负责将任务加入到队列中,而且还负责开启第一个任务的执行。finally块主要负责启动下一个任务,从而形成环环相扣。 ?

    1.1K30

    Java并发编程学习11-任务执行演示

    引言上一篇博文带大家了解了任务执行和 Executor 框架的基础知识,本篇将结合这些内容,演示一些不同版本的任务执行Demo,并且每个版本都实现了不同程度的并发性。...这个时候通过将上述串行执行的任务分解为多个独立的任务并发执行,就能够获得更高的 CPU 利用率和响应灵敏度。2....在 java.util.concurrent.Executors 中包含了一些辅助方法【callable】能将其他类型的任务【Runnable 、java.security.PrivilegedAction...从一个公司获取报价的过程与从其他公司获得报价的过程无关,因此可以将获取报价的过程当成一个任务,从而使获得报价的过程能并发执行。...总结本文以Demo的形式演示了如何寻找任务中更细粒度的并发场景,对我们的并发应用开发有着一定的借鉴意义。了解了任务执行的基本知识,下篇博文开始我们将介绍如何优雅地取消和关闭任务,敬请期待!

    11811

    Java并发学习之定时任务的几种玩法

    Java中创建和玩转定时任务 定时任务,在日常工作中,可以说是一个算是一个常见的需求场景,比如定时数据校验,数据报表输出,报警等 0....前言 前面一篇博文《Java并发学习之四种线程创建方式的实现与对比》, 有朋友指出线程池的方式应该算不上新的方式,而应该把Timer方式创建线程加上 这个却是我个人见识不够,写的时候没有想到Timer这种场景了...实现定时任务 借助调度线程池 Executors.newScheduledThreadPool() 实现定时任务 借助第三方工具,如spring的定时任务; Quartz(听过没用过);以及其他一些开源工具或公司内的服务...Timer&TimerTask 实现方式 使用Timer,需要借助TimerTask类,在其中书写定时任务的逻辑,因为case中有一个每隔一天跑一次的定时任务和一个延迟任务,所以这里用到了Timer的两种定时任务使用方式...Timer可按频率调度任务 2. Timer也支持指定时间调度任务 ScheduledExecutorService 计划任务线程池 1.

    1.7K100

    Java并发编程学习10-任务执行与Executor框架

    任务执行何为任务? 任务通常是一些抽象且离散的工作单元。大多数并发应用程序都是围绕着 “任务执行” 来构造的。而围绕着 “任务执行” 来设计应用程序结构时,首先要做的就是要找出清晰的任务边界。...,但它却为 java.util.concurrent 下的异步任务执行框架提供了基础,该框架有着如下的特点:支持多种不同类型的任务执行策略。...通过限制并发任务的数量,可以确保应用程序不会由于资源耗尽而失败,或者由于在稀缺资源上发生竞争而严重影响性能。...延迟任务与周期任务在 Java 类库中,Timer 类负责管理延迟任务【指定时间后执行该任务】以及周期任务【指定周期执行一次该任务】。...大多数服务器应用程序中都存在一个明显的任务边界:单个客户请求。但有时候,任务边界并非是显而易见的,需要进一步的揭示其粒度更细的并发性。

    15621

    Java 并发编程·Java 并发

    Java 并发 线程状态转换 新建(New) 创建后尚未启动。 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。...時雨:在 《Java 并发核心知识体系精讲》中,参考 Oracle 官方文档,标注实现多线程方式只有两种:实现 Runnable 接口和继承 Thread 类。...当一个计算任务需要执行很长时间,那么就可以用 FutureTask 来封装这个任务,主线程在完成自己的任务之后再去获取结果。...每个线程都维护了一个双端队列,用来存储需要执行的任务。工作窃取算法允许空闲的线程从其它线程的双端队列中窃取一个任务来执行。窃取的任务必须是最晚的任务,避免和队列所属线程发生竞争。...在 Java 内存模型中,允许编译器和处理器对指令进行重排序,重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

    2.7K31

    Java并发编程学习12-任务取消和线程中断

    如何理解任务是可取消的 ?如果外部代码能在某个任务正常完成之前将其置入 “完成” 状态,那么这个任务就被认为是可取消的。大多数任务,我们都希望让它们运行直到结束,或者让它们自行停止。...用户点击图形界面程序中的 “取消” 按钮,或者通过管理接口来发出取消请求,例如 JMX(Java Management Extensions,即 Java 管理扩展)。有时间限制的操作。...在 Java 中没有一种安全的抢占式方式来停止线程,因此也就没有安全的抢占式方法来停止任务。只有一种 协作机制,使请求取消的任务和代码都遵循一种协商好的协议。...我们知道 Java 类库中的一些阻塞库方法支持中断。例如 Thread.sleep 和 Object.wait 等,它们都会检查中断状态,并且在发现中断时提前返回。...如果任务代码能够响应中断,那么可以使用中断作为取消机制,并且利用 Java 类库中提供的中断支持。

    17021

    Java并发编程实战系列6之任务执行(Task Execution)

    同时任务可以并行处理了,吞吐量也提高了。...提供了一种标准的方法将任务的提交与执行过程解耦,并用Runnable(无返回时)或者Callable(有返回值)表示任务。...将请求处理任务的提交与任务的实际执行解耦,并且只需采用另一种不同的Executor实现,就可以改变服务器的行为,其影响远远小于修改任务提交方式带来的影响 2.2 执行策略 这一节主要介绍做一个Executor...在什么线程中执行任务? 任务按照什么顺序执行?FIFO/LIFO/优先级 有多少个任务可以并发执行? 队列中允许多少个任务等待? 如果系统过载了要拒绝一个任务,那么选择拒绝哪一个?...增加生命周期扩展Web服务器的功能 调用stop 客户端请求形式 关闭 2.5 延迟任务与周期任务 使用Timer的弊端在于 如果某个任务执行时间过长,那么将破坏其他TimerTask的定时精确性(执行所有定时任务时只会创建一个线程

    77150

    Java并发编程学习13-任务取消的进阶使用

    这是 Thread API 的一个缺陷,因为无论 join 是否成功地完成,在 Java 内存模型中都会有内存可见性结果,但 join 本身不会返回某个状态来表明它是否成功。2....处理不可中断的阻塞我们知道,为了方便开发人员构建出能响应取消请求的任务,在 Java 类库中的大多数可阻塞的方法都是通过提前返回或者抛出 InterruptedException 来响应中断请求的。...java.io 包中的同步 Socket I/O。在服务器应用程序中,最常见的阻塞 I/O 形式 就是对套接字进行读取和写入。...java.io 包中的同步 I/O。...采用 newTaskFor 来封装非标准的取消我们可以通过 Java 6 在 ThreadPoolExecutor 中新增的 newTaskFor 方法来进一步优化 ReaderThread 中封装非标准取消的技术

    12321

    Airflow 任务并发使用总结

    ,任务的 graph 关系如下,图中每个方框是一个任务 task,标 N 的表示一次需要并发执行多个任务实例,比如 run_can、run_rk、run_sync 这些任务。...含义:它指定了一个任务实例能够同时存在于系统中的最大数量。当任务数量超过这个值时,Airflow会等待之前的任务实例完成,以确保不超过设定的最大并发数。...总结一下,max_active_tasks 主要用于控制单个任务实例的并发性,而 concurrency 用于控制整个 DAG 中任务实例的总体并发性。...task_concurrency 指定了该任务实例的并发度,即允许同时执行的相同任务的实例数量。在这里,设置为1,表示这个任务每次只能运行一个实例。...总之,max_active_tasks 控制单个Dag 实例的最大并发数量,concurrency 控制所有 DAG 实例中任务实例的总体并发数量,而 task_concurrency 控制特定任务的实例并发数量

    63310

    Java 并发编程实战-创建和执行任务的最佳实践

    若无法通过并行流实现并发,则必须创建并运行自己的任务。运行任务的理想Java 8方法就是CompletableFuture。 Java并发的历史始于非常原始和有问题的机制,并且充满各种尝试的优化。...本文将展示一个规范形式,表示创建和运行任务的最简单,最好的方法。 Java初期通过直接创建自己的Thread对象来使用线程,甚至子类化来创建特定“任务线程”对象。手动调用构造函数并自己启动线程。...Java 5中,添加了类来为你处理线程池。可以将任务创建为单独的类型,然后将其交给ExecutorService运行,而不是为每种不同类型的任务创建新的Thread子类型。...副作用是并发编程中的主要问题之一,因为我们看到了CachedThreadPool2.java。...Future是Java 5中引入的机制,允许提交任务而无需等待它完成。

    69420

    从任务到线程:Java结构化并发应用程序

    并发设计的本质,就是要把程序的逻辑分解为多个任务,这些任务独立而又协作的完成程序的功能。而其中最关键的地方就是如何将逻辑上的任务分配到实际的线程中去执行。...在线程中执行任务 并发程序设计的第一步就是要划分任务的边界,理想情况下就是所有的任务都独立的:每个任务都是不依赖于其他任务的状态,结果和边界。因为独立的任务是最有利于并发设计的。...2.Executor框架 任务是一组逻辑工作单元,而线程则是任务异步执行的机制。为了让任务更好地分配到线程中执行,java.util.concurrent提供了Executor框架。...Java中提供Timer来执行延时任务和周期任务,但是Timer类有以下的缺陷: Timer只会创建一个线程来执行任务,如果有一个TimerTask执行时间太长,就会影响到其他TimerTask的定时精度...,Java中设计了另一种接口Callable。

    50820

    😀 Java并发 - (并发基础)

    Java并发 - (并发基础) 1、什么是共享资源 堆是被所有线程共享的一块内存区域。在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例 Java中几乎所有的对象实例都在这里分配内存。...如下图: 2、并发编程的难点 原子性问题 操作系统做任务切换(CPU切换),可以发生在任何一条CPU指令执行完成后; CPU能保证的原子操作是指令级别的,而不是高级语言的操作符(例如:n++)。...为了提高性能,编译器和处理器常常会对指令做重排序; 重排序不会影响单线程的执行结果,但是在并发情况下,可能会出现诡异的BUG。...参考地址:https://zhuanlan.zhihu.com/p/298448987 3、JMM 并发编程的关键目标 并发编程需要处理两个关键问题,即线程之间如何通信和同步。...并发编程的内存模型 共有两种并发编程模型:共享内存模型、消息传递模型,Java采用的是前者。

    19410

    Fork Join 并发任务执行框架

    就是在按指定阈值拆分后,的多个线程,如果线程A的任务执行的比较快,获得到的CPU时间片比较多,那么在他执行完毕后,就会从未执行完毕的线程的任务中的尾部,进行任务窃取,任务完成后再把结果放回去,不会造成任务竞争...; import java.util.concurrent.RecursiveTask; /** * 使用ForkJoin框架实现求和 * @author ZYGisComputer */ public...; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; import...java.util.concurrent.RecursiveAction; /** * 使用ForkJoin框架实现不定个数的任务执行 * @author ZYGisComputer */ public...,execute方法是没有返回值的 作者:彼岸舞 时间:2020\09\18 内容关于:并发编程 本文来源于网络,只做技术分享,一概不负任何责任

    43531

    【Java并发编程二】Java并发包

    1.Java容器 1.1.同步容器 Vector ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。...这个机制允许任意数量的读线程可以并发访问Map,读者和写者也可以并发访问Map,并且有限数量的写进程还可以并发修改Map,结果是为并发访问带来更高的吞吐量,同时几乎没有损失单个线程访问的性能。   ...并发队列 2.1.ConcurrentLinkedQueue ConcurrentLinkedQueue:是一个适用于高并发场景下的队列,通过无所的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue...在Java中,BlockingQueue的接口位于java.util.concurrent 包中(在Java5版本开始提供),由上面介绍的阻塞队列的特性可知,阻塞队列是线程安全的。...所有插入PriorityBlockingQueue的对象必须实现 java.lang.Comparable接口,队列优先级的排序规则就是按照我们对这个接口的实现来定义的。

    73410

    Java并发包源码分析:任务异步执行的结果Future和FutureTask

    Future接口主要提供了异步返回任务执行结果,取消任务执行,获取任务执行状态的功能,接口定义如下: ?...,通知工作线程停止该任务执行。...任务状态state小于等于COMPLETING表示任务还没开始执行,则应用主线程调用awaitDone阻塞休眠,等待Executor的工作线程执行任务并通知唤醒该应用主线程。具体过程如下: ?...三、Executor工作线程执行任务 Executor的工作线程执行该任务时,会调用该任务的run方法,即FutureTask的run方法,如下为FutureTask的run方法定义:首先检查任务状态state...,然后根据mayInterruptIfRunning来控制如果该任务已经在执行,是否中断对应的工作线程来中止该任务的执行,最后调用finishCompletion方法来唤醒等待这个任务执行结果的线程,避免该任务被取消后

    80630
    领券