欢迎访问皮皮网官网
皮皮网

【如何看懂linux源码】【下载openwrt的源码】【php源码 轻支付】java线程池的源码_java线程池源码深度解析

时间:2024-11-15 12:50:35 分类:探索 来源:协同办公thinkphp源码

1.Java的线程线程析并行世界-3.0 线程池与拒绝策略
2.Java多线程——singleThreadExecutor
3.线程池的实现原理 Java线程池实现原理
4.Java线程池实现原理及其在美团业务中的实践
5.java线程池之ScheduledThreadPoolExecutor实现原理
6.Java高并发编程实战5,异步注解@Async自定义线程池

java线程池的源码_java线程池源码深度解析

Java的并行世界-3.0 线程池与拒绝策略

       Jdk并发相关核心类:java.util.concurrent

       java.util.concurrent.Executors提供了一些静态工厂方法,用于创建不同类型的源码线程池,例如:

       ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

       ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

       ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

       ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool();

       可以通过new ThreadPoolExecutor()方法手动创建线程池,码深该方法需要传入四个参数,度解分别是线程线程析如何看懂linux源码核心线程数、最大线程数、池的池源线程保活时间和任务队列。源码其中,码深核心线程数和最大线程数是度解必填参数,线程保活时间和任务队列是线程线程析可选参数。

       Java中的池的池源Executors共有四种创建方式,这些方式包括使用newFixedThreadPool、源码newCachedThreadPool、码深newSingleThreadExecutor和newScheduledThreadPool。度解在使用这些方法时,可以根据实际需求选择最适合的方式来创建线程池。无论哪种方式,线程池都可以有效地管理和控制线程,提高程序的执行效率。

       新FixedThreadPool创建一个固定大小的线程池。

       以下是一个Java中创建newFixedThreadPool的代码例子:

       新CachedThreadPool创建一个根据需要自动扩展的线程池,线程数根据任务数量动态调整。

       以下是一个newCachedThreadPool的Java代码示例:

       新SingleThreadExecutor创建一个只有一个线程的线程池。

       新ScheduledThreadPool创建一个支持定时任务的线程池。

       ForkJoinPool是一个用于执行分而治之任务的线程池,特别适用于递归分解的问题,例如并行归并排序、并行求和等。

       ForkJoinPool forkJoinPool = new ForkJoinPool();

       ForkJoinPool在java.util.concurrent包下,从Java 7开始引入,专门用于处理需要递归分解的任务。它利用工作窃取(Work-Stealing)算法来实现高效的任务调度和线程利用,能够充分利用多核处理器的优势。

       ForkJoinPool的主要特点包括:

       下面是一个简单的使用ForkJoinPool的示例,计算斐波那契数列的值:

       虽然上面5个线程池看上去功能特点不同,但是其内部实现原理都调用了JDK的ThreadPoolExecutor线程池类。

       ThreadPoolExecutor的构造函数有多个参数,允许根据实际需求配置线程池的行为,主要包括:

       corePoolSize:线程池的核心线程数,即线程池中保持的最小线程数量。即使线程处于空闲状态,核心线程也不会被销毁。

       maximumPoolSize:线程池的最大线程数,即线程池中允许的最大线程数量。当任务数量超过核心线程数时,线程池会根据实际情况动态地创建新的线程,但不会超过最大线程数。

       keepAliveTime:非核心线程的下载openwrt的源码空闲时间超过这个时间后,会被销毁,从而控制线程池的大小。时间单位可以通过指定的TimeUnit来定义。

       workQueue:任务队列,用于存放等待执行的任务。ThreadPoolExecutor支持多种类型的任务队列,如ArrayBlockingQueue、LinkedBlockingQueue等。

       threadFactory:用于创建线程的工厂,可以自定义线程的创建方式。

       handler:拒绝策略,当线程池和队列都满了,无法继续接受新的任务时,会触发拒绝策略来处理新的任务。常见的拒绝策略包括AbortPolicy(默认策略,直接抛出异常)、CallerRunsPolicy(由调用线程来执行被拒绝的任务)、DiscardPolicy(丢弃被拒绝的任务)、DiscardOldestPolicy(丢弃队列中最老的任务)。

       ThreadPoolExecutor提供了submit()和execute()等方法来向线程池提交任务,其中:

       submit()方法可以接受Callable和Runnable类型的任务,并返回一个Future对象,通过这个对象可以获取任务的执行结果或者取消任务。

       execute()方法只能接受Runnable类型的任务,无法获取任务的返回结果。

       ThreadPoolExecutor还提供了一些方法来管理和监控线程池的状态,如getActiveCount()、getCompletedTaskCount()、getTaskCount()等。

       workQueue:任务队列,其中的任务是被提交但尚未执行的任务。其类型是:BlockingQueue接口,只能用于存放Runable对象。

       有界队列可以通过ArrayBlockingQueue实现,当有新任务到来时,如果线程池的实际线程数量小于corePoolSize,则会优先创建新的线程;如果大于corePoolSize,则会将新任务加入等待队列;若队列已满,无法加入,则在总线程数量不大于maximumPoolSize的前提下,创建新的线程执行任务;若大于maximumPoolSize,则执行拒绝策略。

       无界队列可以通过LinkedBlockingQueue实现,与有界队列相比,除非系统资源耗尽,不然当有新的任务到来,并且线程数量小于corePoolSize时,线程池就会创建新的线程执行任务。但当线程数量大于corePoolSize后,php源码 轻支付就不会继续创建了。若还有任务进来,系统CPU没那么忙,还有线程资源,则任务直接进入队列等待。

       优先任务队列可以通过PriorityBlockingQueue实现,可以根据任务的优先级执行任务,这是一种特殊的无界队列。

       有界队列和无界队列需要做demo测试。新CachedThreadPool内部使用的是SynchronousQueue队列,这是一个直接提交队列,系统会增加新的线程执行任务,当任务执行完毕后,线程会被回收;如果开启大量任务提交,每个任务执行慢,系统会开启等量的线程处理,直到系统资源耗尽。

       ThreadPoolExecutor的核心调度代码包括workerCountOf(c)来获取当前工作线程池的总数,addWorker(command)用于提交任务或创建线程池,以及reject(command)来执行拒绝策略。

       Handler是RejectedExecutionHandler接口类型,代表了不同的拒绝策略。常见的拒绝策略包括:

       CallerRunsPolicy:如果线程池未关闭,会直接在调用者当前线程执行等待队列放不下的任务。

       AbortPolicy:会直接抛出异常,阻止系统正常运行。

       DiscardPolicy:直接丢失无法放入等待队列的任务,不做异常抛出。

       DiscardOldestPolicy:丢弃最老的一个请求,然后尝试把当前请求任务加入到等待队列。

       注意:在创建ThreadPoolExecutor时需要指定拒绝策略,如果以上拒绝策略无法满足,可以继承RejectedExecutionHandler接口来实现自定义的拒绝策略。

       最常用的是升级DiscardPolicy策略,但需要在放弃前记录请求;示例如下:

       以下是RejectedExecutionHandler接口代码,可以重新实现该方法以满足自定义需求。

       熟悉拒绝策略后,在线程池中还有重要参数ThreadFactory,用于控制线程的创建。通过ThreadFactory,可以实现以下功能:

       命名线程:通过为线程指定有意义的名称,便于跟踪日志和调试信息。

       设置线程属性:根据需要设置线程的优先级、守护状态、异常处理器等。

       定制化线程创建逻辑:添加自定义逻辑来创建线程,如记录线程的创建次数、设置线程组等。玩币族源码

       以下是简单的ThreadFactory示例:

Java多线程——singleThreadExecutor

       singleThreadExecutor,Java中Executors类的一个静态方法,创建了一个线程池,该线程池仅包含一个核心线程。这意味着所有任务将由这一单一线程执行,形成单线程执行模式。若核心线程因异常停止,则将启动新的线程替代,确保服务不中断。此线程池特别设计确保任务执行顺序与提交顺序一致,提升程序执行流程的可预测性与稳定性。

       创建singleThreadExecutor的代码示例如下:

       在这个例子中,ThreadPoolExecutor的corePoolSize和maximumPoolSize的值均为1,明确指出线程池仅包含一个核心线程,且最大线程数同样为1,保证了线程的高效利用。缓冲队列采用的是LinkedBlockingQueue,这是一个无边界队列,用于存储等待执行的任务。

线程池的实现原理 Java线程池实现原理

       1、java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。

       2、线程池的几个主要参数的作用

       corePoolSize: 规定线程池有几个线程(worker)在运行。

       maximumPoolSize: 当workQueue满了,不能添加任务的时候,这个参数才会生效。规定线程池最多只能有多少个线程(worker)在执行。

       keepAliveTime: 超出corePoolSize大小的那些线程的生存时间,这些线程如果长时间没有执行任务并且超过了keepAliveTime设定的时间,就会消亡。

       unit: 生存时间对于的单位

       workQueue: 存放任务的队列

       threadFactory: 创建线程的工厂

       handler: 当workQueue已经满了,并且线程池线程数已经达到maximumPoolSize,将执行拒绝策略。

Java线程池实现原理及其在美团业务中的实践

       随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述了线程池概念和用途,接着结合线程池的