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

线程

Terminated 死亡 可能是线程结束任务之后自己结束,也可能是因产生了异常而结束 ---- 3. start()与run()的区别 通过start()来启动线程可以实现多线程运行,无需等待线程中...当调用execute()方法添加一个任务时,线程池会进行判断,如果当前正在运行的线程数小于corePoolSize,则会立即创建一个核心线程执行任务;如果当前正在运行的线程数大于等于corePoolSize...线程池被创建后其中是否有线程?如果没有,如何进行预热? 线程池被创建后如果没有任务传递就不会有线程存在。...线程池抛出异常后,会怎么处理?...此时线程池不再接收新任务,终止正在运行的任务,停止处理等待队列中的任务并返回正在等待执行的List ---- 16. 线程池如何重用线程?

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

    驾驭Java线程池:定制与扩展

    但是要注意并不是所有的任务都适合于所有的执行策略。如下任务需要制定特殊的执行策略。...无界队列:newFixedThreadPool和newSingleThreadExecutor方法在默认情况下都是使用无界队列,当线程池中所有的任务都在忙碌时,达到的任务将会保存在队列中,如果任务达到的速率大于线程池处理任务的速率...以下代码就是一个制定饱和策略的进程池的实例,其中线程池的大小固定,饱和策略为“调用者运行”。...扩展ThreadPoolExecutor ThreadPoolExecutor提供了可扩展的方法: beforeExecute: 在任务被执行之前被调用; afterExecute: 无论任务执行成功和还是抛出异常...,都在返回后执行;如果任务执行中出现Error或是beforeExecute抛出异常,则afterExecutor不会被执行。

    57920

    Java线程池详解

    构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段。...ThreadPoolExecutor构造方法 Executors中创建线程池的快捷方法,实际上是调用了ThreadPoolExecutor的构造方法(定时任务使用的是ScheduledThreadPoolExecutor...,甚至耗尽线程; workQueue设置不当容易导致OOM; handler设置不当会导致提交任务时抛出异常。...线程池的处理结果、以及处理过程中的异常都被包装到Future中,并在调用Future.get()方法时获取,执行过程中的异常会被包装成ExecutionException,submit()方法本身不会传递结果和任务执行过程中的异常...ExecutorCompletionService提供了等待所有任务执行结束的有效方式,如果要设置等待的超时时间,则可以通过CountDownLatch完成。

    39510

    Java异步编程——深入源码分析FutureTask

    回顾这个Demo做了什么, 构建了一个线程池 往线程池里面丢两个需要执行的任务 最后获取这两个任务的结果 其中第二点是异步执行两个任务,这两个任务和主线程分别是用了三个线程并发执行的,第三点是在主线程中同步等待两个任务的结果...它不接收任何参数,可以返回结果,可以抛出异常。相类似的还有Runnable,它也是不接收,不同点在于它不返回结果,也不抛异常,异常需要在任务内部处理。...原来接口只接收Callable参数,实现类中还新增了接收Runnable参数的。 如果看过之前写的《你真的懂ThreadPoolExecutor线程池技术吗?...如果状态是NORMAL,正常结束的话,则把outcome变量返回; 如果是取消或者中断状态的,则抛出取消异常; 如果是EXCEPTION,则把outcome当作异常抛出(之前setException()...调用get()获取outcome时,如果任务未完成,会阻塞线程,等待执行完毕。 异常和正常结果都放在outcome中,调用get()获取结果或抛出异常。 ----

    60830

    jvm源码分析(四)ThreadPoolExecutor

    ()钩子方法; 终止(TERMINATED):terminated()方法结束后的线程池状态; 三、线程池主要方法解析 ThreadPoolExecutor中有个int型变量(其实是AtomicInteger...isRunning(recheck) && remove(command)) // 拒绝策略,抛出异常 reject(command); // 如果发现没有...这个方法没有什么作用,就是抛出一个异常 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException...拒绝策略的分类有哪些 AbortPolicy,默认,线程池会抛出异常,并终止执行 CallerRunsPolicy,把任务交给当前线程来执行 DiscardPolicy,忽略此任务(新任务) DiscardOldestPolicy...,如果线程池没有关闭,则丢弃阻塞队列中最老的一个 如何自定义拒绝策略 实现RejectedExecutionHandler接口,重写rejectedExecution 方法。

    40530

    Java Review - 并发编程_ScheduledThreadPoolExecutor原理&源码剖析

    FutureTask的内部有一个变量state用来表示任务的状态,一开始状态为NEW,所有状态为 private static final int NEW = 0; //...其实当同一个command被多次提交到线程池时就会存在这样的情况,因为同一个任务共享一个状态值state。 如果任务执行失败,则执行代码(13.1)。...表示提交任务后延迟多少时间开始执行任务command delay表示当任务执行完毕后延长多少时间后再次运行command任务 unit是initialDelay和delay的时间单位 任务会一直重复运行直到任务运行中抛出了异常...执行完毕后,会重新设置任务的延迟时间,然后再把任务放入延迟队列,循环往复。需要注意的是,如果一个任务在执行中抛出了异常,那么这个任务就结束了,但是不影响其他任务的执行。...任务分为三种,其中一次性执行任务执行完毕就结束了,fixed-delay任务保证同一个任务在多次执行之间间隔固定时间,fixed-rate任务保证按照固定的频率执行。

    34120

    java线程池,阿里为什么不允许使用Executors?

    许多文章会将上下文切换、CPU调度列入其中,这边不将线程调度列入是因为睡眠中的线程不会被调度(OS控制),如果不是睡眠中的线程那么是一定需要被调度的。...线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。...newSingleThreadExecutor (ThreadPoolExecutor)创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。...如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。...当线程数大于等于核心线程数,且任务队列已满 若线程数小于最大线程数,创建线程 若线程数等于最大线程数,调用拒绝执行处理程序(默认效果为:抛出异常,拒绝任务) 那么这三个参数推荐如何设置,有最优值吗?

    1.1K20

    Java线程池详解

    Callable是JDK1.5时加入的接口,作为Runnable的一种补充,允许有返回值,允许抛出异常。 三种提交任务的方式: ?...如何正确使用线程池 避免使用无界队列 不要使用Executors.newXXXThreadPool()快捷方法创建线程池,因为这种方式会使用无界的任务队列,为避免OOM,我们应该使用ThreadPoolExecutor...(512),  new ThreadPoolExecutor.DiscardPolicy());// 指定拒绝策略 获取处理结果和异常 线程池的处理结果、以及处理过程中的异常都被包装到Future中...,并在调用Future.get()方法时获取,执行过程中的异常会被包装成ExecutionException,submit()方法本身不会传递结果和任务执行过程中的异常。...ExecutorCompletionService提供了等待所有任务执行结束的有效方式,如果要设置等待的超时时间,则可以通过CountDownLatch完成。

    65830

    java中有界队列的饱和策略(reject policy)

    ); 上面的例子中我们定义了一个初始5个,最大10个工作线程的Thread Pool,并且定义其中的Queue的容量是20。...AbortPolicy AbortPolicy意思是如果队列满了,最新的提交任务将会被拒绝,并抛出RejectedExecutionException异常: public static class...poll了最老的一个任务,然后使用ThreadPoolExecutor提交了一个最新的任务。...CallerRunsPolicy CallerRunsPolicy和其他的几个策略不同,它既不会抛弃任务,也不会抛出异常,而是将任务回退给调用者,使用调用者的线程来执行任务,从而降低调用者的调用速度。...从而导致主线程在该任务执行结束之前不能提交任何任务。从而有效的阻止了任务的提交。 使用Semaphore 如果我们并没有定义饱和策略,那么有没有什么方法来控制任务的提交速度呢?

    80020

    JAVA线程池学习以及队列拒绝策略

    在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。...如果正在运行的线程等于corePoolSize时,ThreadPoolExecutor优先往队列中添加任务,直到队列满了,并且没有空闲线程时才创建新的线程。...这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。...线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。...此时所有任务都没有执行结束,主线程又继续提交任务,线程池进入默认异常策略(AbortPolicy)拒绝服务。

    1.1K21

    线程池那些事儿

    实际开发中我们需要让程序执行某个特定任务时,就会开启一个线程,如果并发的线程数量太多,频繁地创建线程就会严重影响系统的运行效率,如何解决呢?有没有一种方式可以让线程得到复用?...,常用的拒绝策略有以下四种: ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常。...ThreadPoolExecutor.DiscardPolicy:丢弃任务不抛出异常。...2、SHUTDOWN: 关闭状态,线程池不接收新任务,但是会处理队列中的任务。 3、STOP : 停止状态,线程池中断所有正在运行的任务,不接收新任务,同时也不处理队列中的任务。...特点:如果该线程异常结束,会重新创建一个新的线程继续执行任务,唯一的线程可以保证所提交任务的顺序执行。

    48220

    (78) 线程池 计算机程序的思维逻辑

    任务拒绝策略 如果队列有界,且maximumPoolSize有限,则当队列排满,线程个数也达到了maximumPoolSize,这时,新任务来了,如何处理呢?此时,会触发线程池的任务拒绝策略。...默认情况下,提交任务的方法如execute/submit/invokeAll等会抛出异常,类型为RejectedExecutionException。...不过,拒绝策略是可以自定义的,ThreadPoolExecutor实现了四种处理方式: ThreadPoolExecutor.AbortPolicy:这就是默认的方式,抛出异常 ThreadPoolExecutor.DiscardPolicy...它的含义是,当新任务到来时,如果正好有空闲线程在等待任务,则其中一个空闲线程接受该任务,否则就总是创建一个新线程,创建的总线程个数不受限制,对任一空闲线程,如果60秒内没有新任务,就终止。...比如任务A,在它的执行过程中,它给同样的任务执行服务提交了一个任务B,但需要等待任务B结束。 如果任务A是提交给了一个单线程线程池,就会出现死锁,A在等待B的结果,而B在队列中等待被调度。

    67270

    12分钟从Executor自顶向下彻底搞懂线程池

    它的设计思想是什么样的?工作任务有几种?有什么特点?如何适配然后交给Executor的?线程池是如何实现的?有哪些核心参数,该如何配置?工作流程是怎样的?线程池如何优雅的处理异常?如何关闭线程池?...前文说过执行submit时会将Callable封装成FutureTask执行在其实现Runnable中,在执行Callable任务时,如果出现异常会封装在FutureTask中  public void...它在循环中不停的获取阻塞队列中的任务执行,在执行前后预留钩子方法继承**ThreadPoolExecutor**来重写执行后的钩子方法,记录执行完是否发生异常,如果有异常则进行日志记录,作一层兜底方案 ...任务会被执行完将线程池状态设置为SHUTDOWN中断所有未正在执行任务的线程shutdownNow 任务不一定会执行完将线程池状态设置为STOP尝试停止所有正在执行或暂停任务的线程返回等待执行任务列表通常使用...、另一个以任务结束为周期起点获取定时任务的流程是相同的,只是它们构建的定时任务中延迟的时间不同定时任务使用period 区别,为正数周期起点为任务开始,为负数时周期起点为任务结束总结本篇文章围绕线程池,

    28921

    线程池实现原理

    PriorityBlockingQueue:一个具有优先级的无限阻塞队列。线程工厂:可以自定义线程的名字,方便区分拒绝策略AbortPolicy:直接抛出异常。...异常处理:execute: execute方法不会抛出任务执行时的异常,因为没有返回结果,所以任务执行的异常只能由任务本身处理。...调用Future对象的get()方法获取任务的执行结果时,如果任务抛出异常,get()方法会将异常封装在ExecutionException中并抛出。...所有任务都被终结,有效线程为 0,并触发 terminated()方法。TERMINATED :对应的高 3 位值是 011。当 terminated()方法执行结束。...DiscardPolicy:ThreadPoolExecutor.DiscardPolicy()是另一种简单的拒绝策略。当线程池无法接受新任务时,新任务会被丢弃,不会抛出异常。

    7410

    (77) 异步任务执行服务 计算机程序的思维逻辑

    接口没有限定任务如何执行,可能是创建一个新线程,可能是复用线程池中的某个线程,也可能是在调用者线程中执行。...,如果任务还未执行完成,会阻塞等待,另一个get方法可以限定阻塞等待的时间,如果超时任务还未结束,会抛出TimeoutException。...isDone表示任务是否结束,不管什么原因都算,可能是任务正常结束、可能是任务抛出了异常、也可能是任务被取消。...重新抛出,通过异常的getCause方法可以获取原异常 任务被取消了,get方法会抛出异常CancellationException 如果调用get方法的线程被中断了,get方法会抛出InterruptedException...而对于invokeAny,只要有一个任务在限时内成功返回了,它就会返回该任务的结果,其他任务会被取消,如果没有任务能在限时内成功返回,抛出TimeoutException,如果限时内所有任务都结束了,但都发生了异常

    80380

    为师妹写的《Java并发编程之线程池十八问》被表扬啦!

    当线程发生错误结束时,线程池会补充一个新的线程; newCachedThreadPool:创建可缓存的线程池,如果线程池的容量超过了任务数,自动回收空闲线程,任务增加时可以自动添加新线程,所有线程在当前任务执行完毕后...若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务,线程异常结束,会创建一个新的线程,能确保任务按提交顺序执行; newWorkStealingPool...第四问:如何给线程池命名?    如果我们的项目模块较多,在运行时调用了不同模块的线程池,为了在发生异常后快速定位问题,我们一般会在构建线程池时给它一个名字,这里我们提供几种线程池命名的方法。...第二种通过submit()提交任务时,如果在任务执行中发生异常,这个异常不会直接打印出来。相反,异常会被封装在由submit()返回的Future对象中。...tasks; // 返回队列中未被执行的任务列表 } 与shutdown不同的是shutdownNow会尝试终止所有的正在执行的任务,清空队列,停止失败会抛出异常,并且返回未被执行的任务列表。

    8110

    从使用到原理学习Java线程池

    ; 4、如果队列满了,而且正在运行的线程数量大于或等于 maximumPool Size,那么线程池会抛出异常RejectExecutionException。...如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。...线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。 CachedThreadPool:无界线程池,可以进行自动线程回收。 ?...maximumPoolSize,那么线程池会抛出异常RejectExecutionException。...通过这一个变量保存了两个内容: 所有线程的数量 每个线程所处的状态 其中低29位存线程数,高3位存runState,通过位运算来得到不同的值。 ?

    34321

    线程池

    0则添加一个非核心线程,并且不指定首次执行任务 addWorker(null, false); } //否则如果添加非核心线程,指定首次执行任务,如果添加失败,执行异常策略...下面我们来了解,这个任务是如何添加到Worker中的,这就要看一下addWorker是如何实现的,篇幅原因不贴出代码,读者可以跟着上述源码分析步骤自行阅读。...当一个任务成功加入到了Worker中,是如何执行的呢?...或者线程池已经STOP,那么所有线程都会被中断,然后退出。到这里就分析结束了,虽然用了简单的语言概括了线程池的原理,但是里面的细节还是很多的,读者有必要亲自查看源码,例如线程池的线程是如何复用等等。...AbortPolicy:默认拒绝处理策略,抛出异常。 b. DiscardPolicy:丢弃新来的任务,但是不抛出异常。 c.

    50320

    【Java线程】复盘线程池使用及思考

    思考如果不放入容器中,会存在什么问题。—资源浪费。如果不放入容器中,每次执行任务时都会创建线程池,执行完任务再关闭线程池。...如果任务请求次数很多,便会创建很多线程池,岂不是造成很大的资源浪费,故将其放入容器中管理。...下面看下两种不同任务的提交方式,是如何处理异常。...设置UncaughtExceptionHandler 是无效的,因为该函数返回一个Future的对象,如果线程执行过程中有未捕获异常,会被包在Future对象中,不会抛出异常。...这里的思路是 线程执行的异常,也是返回值的一部分,由获取返回值的时候再次抛出。 线程池是否需要关闭 理论上任务执行结束以后,记得将我们线程池关闭。

    62530
    领券