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

ScheduledExecutorService等待任务完成,挂起的任务堆积起来最终会中断主线程吗?

ScheduledExecutorService等待任务完成,挂起的任务堆积起来最终不会中断主线程。

ScheduledExecutorService是Java中的一个线程池,用于定时执行任务。当使用ScheduledExecutorService的awaitTermination方法等待任务完成时,如果有挂起的任务堆积起来,它们不会中断主线程。

awaitTermination方法用于等待线程池中的所有任务完成,它会阻塞主线程直到所有任务执行完毕或超时。如果有挂起的任务堆积起来,它们会继续等待执行,不会中断主线程。

这种情况下,如果希望中断主线程并停止等待挂起的任务,可以使用ScheduledExecutorService的shutdownNow方法。该方法会尝试中断所有正在执行的任务,并返回等待执行的任务列表。但需要注意的是,这并不保证能够成功中断所有任务,因为任务可能会忽略中断请求。

总结起来,ScheduledExecutorService等待任务完成时,挂起的任务堆积起来不会中断主线程。如果需要中断主线程并停止等待挂起的任务,可以使用shutdownNow方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java基础教程(15)-多线程基础

例如, main 线程在启动 t 线程后,可以通过 t.join() 等待 t 线程结束后再继续运行 操作线程 中断线程两种方式: 对目标线程调用 interrupt() 方法可以请求中断一个线程,目标线程通过检测...使用 shutdown() 方法关闭线程时候,它会等待正在执行任务完成,然后再关闭。...shutdownNow() 立刻停止正在执行任务, awaitTermination() 则会等待指定时间让线程池关闭。 需要反复执行任务,可以使用 ScheduledThreadPool 。...在调用 get() 时,如果异步任务已经完成,我们就直接获得结果。如果异步任务还没有完成,那么 get() 阻塞,直到任务完成后才返回结果。...一个 Future 接口表示一个未来可能返回结果,它定义方法有: get() :获取结果(可能等待) get(long timeout, TimeUnit unit) :获取结果,但只等待指定时间

5610

老伙计,关于JDK并发包,这些不为人知秘密你知道多少?

最后真正完成工作只有 t1,而 t2 线程则放弃其任务直接退出,释放资源。 除了等待外部通知之外,要避免死锁还有一种方式就是限时等待 ? 老伙计,关于JDK并发包,这些不为人知秘密你知道多少?...这里设置了 3 秒等待时间,但是占用锁线程持有锁时间为 5 秒,因此第二个线程请求锁失败。...CAS操作来存储当前锁状态,判断锁是否已经被别的线程持有了 等待队列:所有没有请求到锁线程进入等待队列等待。...待有线程释放锁后,系统就能从等待队列中唤醒一个线程继续工作 阻塞源语 park() 和 unpark():用来挂起和恢复线程。没有得到锁线程将会被挂起。...老伙计,关于JDK并发包,这些不为人知秘密你知道多少? 这里计数数量为6,每当一个线程完成任务后,倒计数器就会减1,使用await()方法,要求主线程等待所有任务都执行完成后才能执行。

31640

Java 中为什么不推荐在 while 循环中使用 sleep()

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么在循环中不推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...// 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博所说有很大关系但不完全正确:我们都知道 Java 线程实际对应着操作系统中一个线程,...对线程挂起和唤醒是一个很耗性能操作,因此我们需要避免对线程进行挂起和唤醒;但还一个重要原因是忙等待,如上文所示 FLAG 变量状态可能永远不会被改变,那么线程将会不断进行挂起和唤醒,进入忙等待状态...因此,原文博只是提供了一些场景下方案,下面我们结合一些具体场景来探讨一些可行方案:定时轮询场景定时轮询场景我们可以采用博提供思路,比如 Timer 及 ScheduledExecutorService...在 Java AQS 等待获取锁和线程任务为空等待任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般结合使用,避免线程频繁挂起和唤醒。

51530

线程池(二)

关闭线程池通常有两种方式: shutdown()方法:调用此方法后,线程池会停止接收新任务,并尝试将已提交任务执行完成。已提交但未执行任务继续执行,而不会被丢弃。...shutdownNow()方法:调用此方法后,线程尝试停止所有正在执行任务,并丢弃所有未执行任务。该方法会通过中断(interrupt)线程来终止任务执行。...如果等待超时,调用shutdownNow()方法中断执行中任务,并尝试终止线程池。最后,调用isTerminated()方法判断线程池是否已经终止,确认所有任务都已完成。...// 等待线程池中任务执行完成,最多等待5秒 if (!...(); // 再次等待线程池中任务执行完成,最多等待5秒 if (!

14510

这些并发编程知识,一定要知道

如果调用了线程prestartAllCoreThreads()方法, 线程提前创建并启动所有基本线程。 2)runnableTaskQueue(任务队列):用于保存等待执行任务阻塞队列。...线程返回一个future类型对象,通过这个future对象可以判断任务是否执行成功,并且可以通过futureget()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用get(long...它们原理是遍历线程池中工作线程,然后逐个调用线程interrupt方法来中断线程,所以无法响应中断任务可能永远无法终止。...我们可以执行FutureTask.get()方法来等待任务执行完成。当任务成功完成后FutureTask.get()将返回该任务结果。...int类型参数作为计数器,如果你想等待N个点完成,这里就传入N。

21520

Java 多线程 (Part1: Java线程基础)

使用, 也是ExecutorService一种 ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); /...newSingleThreadExecutor 只有唯一线程线程池, 支持 FIFO, LIFO; 如果唯一线程dead, new 一个新线程 Java Thread LifeCycle 线程生命周期...CPU执行时间片 Interrupt 线程中断 使用interrupt 将 thread 从 RUNNING 变成 Terminated Join 等待其他线程Terminated 使用...,存储状态(上下文),找到下一个存储状态(上下文),恢复对应process,切换成功 JAVA 线程上下文切换原因 当前任务时间片用完,cpu调度下一个任务 当前任务被阻塞,cpu调度下一个任务 多个任务抢占...Lock,没有抢到Lock,被挂起,继续下一任务 代码挂起任务,让出cpu时间 Hardware Interrupt

30130

使用ScheduledExecutorService执行周期性任务需要注意地方

自带这个周期性调度器时一定要确保任务内部不能抛出运行时异常,否则后续任务将不会执行,至于原因,接下来将从源码角度分析下: 使用Excutors工厂类创建ScheduledExecutorService...ThreadPoolExecutor类runWorker方法,该方法不断从任务队列中取任务并执行,ScheduledExecutorService scheduleAtFixedRate方法内部创建了经过包装任务...; // allow interrupts boolean completedAbruptly = true; try { //getTask方法可能阻塞或者等待超时等待任务...如果线程池已经处于STOP状态并且当前线程没有被中断中断线程 2....()返回true时,才会设置任务下次执行时间并重新把该任务放入任务等待队列中, 周期性任务调用是FutureTask.runAndReset()方法,下面就是揭开问题面纱部分: protected

36720

聊聊线程池,ThreadPoolExecutor源码详解

线程池就起到这么一个重用,它负责了线程缓存,也负责对线程进行统一分配、调优与监控。通过多个任务重用线程,实现线程复用效果,最终减少系统开销; 1.1 什么时候使用线程池?...shutdown()方法可以平滑地关闭 ExecutorService,调用该方法后,将导致 ExecutorService 停止接受任何新任务等待已经提交任务执行完成(已经提交任务会分两类:...,但能处理已经提交任务; STOP:线程池处于此状态下,不接收新任务,也不会处理已经提交任务,会将已经提交任务中断; TIDYING:当所有的任务已终止,ctl记录有效线程数量为0时,线程变为...当线程池中线程数量大于corePoolSize时候,如果这时没有新任务提交,核心线程线程不会立即销毁,而是等待,直到等待时间超过了keepAliveTime; unit:时间单位,为 keepAliveTime...,shutdown只会中断当前被阻塞挂起没有执行任务线程); 之后执行beforeExecute()函数,该方法为扩展接口代码,表示在具体执行任务之前出一些处理,然后就开始执行task.run()函数去真正地执行具体任务

39410

Java中中断机制

在Java中,用于终止一个正在运行中线程,并非调用stop方法,而是自行设置一个标志位,在安全点检测标志位,决定是否退出,但也可能因为线程挂起,无法走到标志位。...因此,Java线程提供了中断机制,Thread类提供了中断线程执行调用方法:interrupt,用于中断线程挂起等待,调用interrupt方法后,线程会被唤醒,待下次cpu调度就会继续执行中断代码...那么,抛出InterruptedException后,线程终止? 如果不捕获InterruptedException,那么线程就会因为异常终止,是因为异常终止,并不是因为被中断。...如果捕获了InterruptedException,那么线程就不会终止。 中断,其实只是jvm用于唤醒因锁竞争、I/O操作、休眠等待挂起线程,并设置一个中断标志,我们可以利用这个标志去做一些处理。...比如,当我们发送消息给远程服务器,并休眠等待结果时,如果线程被唤醒,并设置了中断标志,此时我们可以知道,并非等到结果被唤醒,而是被中断唤醒,可以决定是继续等待结果,还是放弃等待

97130

写给Android工程师协程指南

抢占式指的是操作系统可以在没有任务主动放弃CPU情况下,强制中断 当前任务,以便其他任务可以获得执行。这也就意味着,抢占式多任务通常是需要硬件支持,以便操作系统可以在必要时强制中断任务。...挂起与恢复 站在初学者视角,当聊到挂起与恢复,开发者到底想了解什么? 什么是挂起恢复?挂起挂起什么?挂起线程?还是挂起一个函数?恢复又是具体指什么?又是如何做到恢复呢?...但并不是说加了这个关键字就一定会挂起,suspend 只是作为一个标记,用于告诉编译器,该函数可能挂起并暂停执行(即该函数可能执行耗时操作,并且好事期间暂停执行并等待耗时操作完成,同时需要将控制权返回给调用方...在 Jvm 平台,因为 协程 底层离不开 Java线程模型 ,故最终任务也是需要 线程最终去承载。所以从底层而言,我们可以通俗且大胆认为协程就是一个线程框架,这没问题。...每个任务将在一个可用线程上运行,任务执行结束后,线程将返回线程池以供以后使用,并且通过在队列中等待任务来保持活动状态。

1.3K40

Java并发学习之玩转线程

通俗说明 对比之前,有必要先说明下线程几个特点: 重复利用 有过期时间 线程池为空时,提交任务时,新创建线程 线程池满时,提交任务放在等候队列里 等候队列也满了,可以采取扔掉/等待/抛异常等各种处理方式...如果所有线程线程都始终保持繁忙,但队列中包含挂起工作,则线程池将在一段时间后创建另一个辅助线程线程数目永远不会超过最大值。超过最大值线程可以排队,但他们要等到其他线程完成后才启动。 II....方法来关闭线程池 shutdown原理是只是将线程状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务线程 shutdownNow原理是遍历线程池中工作线程,然后逐个调用线程interrupt...方法来中断线程,所以无法响应中断任务可能永远无法终止 调用了这两个关闭方法其中一个,isShutdown方法就会返回true。...这个时候新任务C,挂在阻塞队列中,知道线程池中某个任务执行完毕,释放资源之后,任务C才会执行 简单来说,这个固定大小线程池,就是线程池中任务恒定为指定个数(即便空闲,也会有这么几个线程在);其他任务都放在阻塞队列中执行

64860

异步编程 - 04 基于JDK中Future实现异步编程(上)_Future & FutureTask 源码解析

---- Future接口方法详解 Future类共有5个接口方法,下面我们来一一讲解 V get() 等待异步计算任务完成,并返回结果; 如果当前任务计算还没完成则会阻塞调用线程直到任务完成; 如果在等待结果过程中有其他线程取消了该任务...,则调用线程抛出CancellationException异常; 如果在等待结果过程中有其他线程中断了该线程,则调用线程抛出InterruptedException异常; 如果任务计算过程中抛出了异常...---- FutureTaskget()方法 等待异步计算任务完成,并返回结果; 如果当前任务计算还没完成则会阻塞调用线程直到任务完成; 如果在等待结果过程中有其他线程取消了该任务,则调用线程抛出...return report(s); } 如代码1所示,获取任务状态,如果任务状态值小于等于COMPLETING,则说明任务还没有完成,所以调用awaitDone挂起调用线程。...代码1.2无限循环等待任务完成,其中代码1.2.1表示如果发现当前线程中断,则从等待链表中移除当前线程对应节点(如果队列里面有该节点的话),然后抛出InterruptedException异常;代码

17840

性能测试必备知识(5)- 深入理解“CPU 上下文切换”

灵魂拷问二 上面老说到任务】到底是什么呢? 是进程,线程?是的,进程和线程是最常见任务 那除此之外,还有其他任务?...回答 硬件通过触发信号,导致中断处理程序调用,也是一种常见任务 所以,根据任务不同,CPU 上下文切换可以分为不同场景 进程上下文切换 线程上下文切换 中断上下文切换 系统调用 Linux...,当某个进程时间片耗尽了,就会被系统挂起,切换到其它正在等待 CPU 进程运行 3 - 资源不足 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行...4 - sleep 函数 当进程通过睡眠函数 sleep 这样方法将自己主动挂起时,自然也重新调度 5 - 优先级更高 当有优先级更高进程运行时,为了保证高优先级进程运行,当前进程会被挂起,由高优先级进程来运行...当进程只有一个线程时,可以任务进程=线程 当进程有多个线程时,线程共享进程虚拟内存和全局变量等资源,在线程上下文切换时这些资源是不需要修改 线程也有独立数据,比如栈、寄存器等,这些在线程上下文切换时是需要保存

88920

Java 异步编程实战之基于 JDK 中 Future 实现异步编程|送书

,并返回结果;如果当前任务计算还没完成则会阻塞调用线程直到任务完成;如果在等待结果过程中有其他线程取消了该任务,则调用线程抛出CancellationException异常;如果在等待结果过程中有其他线程中断了该线程...内存语义来保证写入outcome时候会把值刷新到内存,读取时候内存读取,从而避免多线程下内存不可见问题(可以参考《Java并发编程之美》一书)。...3.4 FutureTaskget()方法 等待异步计算任务完成,并返回结果;如果当前任务计算还没完成则会阻塞调用线程直到任务完成;如果在等待结果过程中有其他线程取消了该任务,则调用线程抛出CancellationException...return report(s); } 如上代码1获取任务状态,如果任务状态值小于等于COMPLETING则说明任务还没有被完成,所以调用awaitDone挂起调用线程。...,如果传递timed为false说明没有设置超时时间,则deadline设置为0 代码1.2无限循环等待任务完成,其中代码1.2.1如果发现当前线程中断则从等待链表中移除当前线程对应节点(

1.7K10

一文读懂JDK源码:ThreadPoolExecutor

),它保证添加到队列中任务按照任务延时时间进行排序,延时时间少任务首先被获取; 超出基本大小线程会被立即销毁,因此 keepAliveTime 设置为 0 纳秒了。...:它是不存储元素阻塞队列,每个插入操作都必须等待一个移出操作,否则一直put线程一直阻塞(内部维护了一个Transferer 抽象类,提供了公平抢占消费&非公平抢占消费实现); 超出基本大小线程资源在一段时间后会被销毁...=1; 工作线程队列是 DelayedWorkQueue:它是一个优先级队列容器(肯定是优先级队列呀,延迟低任务必须必延迟高任务先被执行),它保证添加到队列中任务按照任务延时时间进行排序,延时时间少任务首先被获取...JDK线程池是如何完成工作调度呢? 那么一个线程池,最终是如何工作呢?阻塞队列和工作线程又是怎么配合,实现快速消费任务呢?...首先,所有任务调度都是由execute方法完成,这部分完成工作是: 检查现在线程运行状态、运行线程数、运行策略; 决定接下来执行流程,是直接申请线程执行,或是缓冲到队列中执行,亦或是直接拒绝该任务

29220

面试突击:多线程 | 水帘洞版(免费下载)

,操作完成后再将变量写内存,不能直接操作主内存中变量,各个线程工作内存中存储着内存中变量副本拷贝,因此不同线程间无法访问对方工作内存,线程通信(传值)必须通过内存来完成,其简要访问过程...当阻塞队列也满了之后,那么将会继续创建(maximumPoolSize-corePoolSize)个数量线程来执行任务,如果任务处理完成,maximumPoolSize-corePoolSize 额外创建线程等待...线程池执行 shutdown() 后,就会拒绝接收新任务,但是等待线程池中正在执行任务和已经进入阻塞队列任务都执行完之后才最终关闭线程池。...而 shutdownNow() 方法,相对就激进一些了,线程池执行 shutdownNow() 后,拒绝接收新任务,同时还会中断线程池中正在执行任务,已经进入阻塞队列任务也被剥夺了执行机会,不过这些被剥夺执行机会任务作为...因为 shutdownNow() 方法会中断正在执行线程,所以提交到线程任务,如果需要优雅地结束,就需要正确地处理线程中断

31610

读《java高并发程序设计》后感

juc并发包下重入锁ReentrantLock较synchronized有什么优点? 1.中断响应,如果一个线程等待锁,接受通知可以中断,以防止无需等待,产生死锁。...10个线程完成任务,然后再do some thing 循环栅栏CyclicBarrier 可以等等指定的如10个线程都准备就绪,然后再执行任务,再等待所有线程都执行完成,然后再do some thing...ScheduledExecutorService接口在ExecutorService接口之上扩展了在给定时间执行某任务功能,如在某个固定延时之后执行,或者周期性执行某个任务。...维护一个共享资源state,通过内置FIFO来完成获取资源线程排队工作。...(或共享式或独占式)加入到同步队列尾部(采用自旋CAS来保证此操作线程安全),随后线程阻塞;释放时唤醒头结点后继结点,使其加入对同步状态争夺中。

16210

【Java并发编程】- 02 线程池总结

: shutdown():优雅关闭线程池,之前提交任务将被执行,包括当前正在执行等待队列中任务,但是线程池不会再接收新任务,提交新任务抛出异常 shutdownNow():调用shutdownNow...方法后, 线程池就不会再接受新任务了,并且丢弃工作队列里面的任务,正在执行任务会被中断, 该方法会立刻返回,返回值为这时候队列里面被丢弃任务列表。...方法后,当前线程会被阻塞,直到线程池状态变为TERMINATED才返回, 或者等待时间超时才返回、或当前线程中断 submit()系列方法: public Future<?...线程池状态 RUNNING:接收新任务并处理排队任务; SHUTDOWN:不接收新任务,但处理排队任务,调用shutdown()处于该状态; STOP:不接收新任务,也不处理排队任务,并中断正在运行任务...,线程池在完成初始化后,默认情况下,线程池中并没有任何线程线程等待任务到来时,再创建新线程去执行任务 maximumPoolSize:最大线程数,线程池有可能会在核心线程基础上,额外增加一些线程

33310
领券