皮皮网

皮皮网

【ios 新闻资讯 源码】【台账管理系统源码】【租号商城源码】fixedthreadpool源码

时间:2024-11-19 02:17:22 分类:百科

1.Java的并行世界-3.0 线程池与拒绝策略
2.Java并发编程之newFixedThreadPool线程池
3.java四种线程池创建
4.java常用的几种线程池实例讲解
5.scheduledthreadpoolexecutor 初始化多少个

fixedthreadpool源码

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()方法手动创建线程池,该方法需要传入四个参数,分别是核心线程数、最大线程数、ios 新闻资讯 源码线程保活时间和任务队列。其中,核心线程数和最大线程数是必填参数,线程保活时间和任务队列是可选参数。

       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:非核心线程的空闲时间超过这个时间后,会被销毁,从而控制线程池的大小。时间单位可以通过指定的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后,就不会继续创建了。若还有任务进来,系统CPU没那么忙,还有线程资源,则任务直接进入队列等待。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       以下是简单的ThreadFactory示例:

Java并发编程之newFixedThreadPool线程池

       在计算机硬件性能提升和多核CPU普及的背景下,Java开发者面临如何优化程序运行效率的问题。为此,Java提供了线程池机制,其中newFixedThreadPool是一个重要组件,用于管理和限制线程数量,减少创建和销毁的开销。

       newFixedThreadPool是一种固定大小的线程池,线程数量在创建时就确定,并保持不变。它通过LinkedBlockingQueue队列管理任务,当线程忙碌时,新任务会被阻塞直到有空闲线程。然而,过快的任务提交可能导致队列无限增长,引发内存溢出。因此,合理设置线程池大小和队列容量至关重要。

       使用newFixedThreadPool很简单,只需创建ThreadPoolExecutor对象并提交任务。需要注意线程池的关闭,例如通过executorService.shutdown()。newFixedThreadPool有其优点,如稳定性和可扩展性,但也存在缺点,如任务执行过程中异常处理的差异。

       线程池有两种主要任务提交方式,execute()和submit(),它们处理返回值和异常的方式有所不同。execute()适用于异步提交,而submit()提供了Future对象,支持同步提交和取消任务。在任务全部执行完毕后,可以使用executorService.awaitTermination()方法阻塞主线程直到任务完成。

       总的来说,newFixedThreadPool是Java并发编程中的有力工具,通过合理配置,可以有效提升程序性能和稳定性。开发者需要根据实际需求选择合适的线程池,并调整其参数,以达到最佳性能效果。

java四种线程池创建

       newFixedThreadPool

       newFixedThreadPool 是 Executors 工具类提供的一个静态方法,用于创建一个固定大小的线程池。该线程池具有固定数量的核心线程,且没有最大线程数限制。如果所有的核心线程都在执行任务,新任务会被放入队列中等待执行。这种线程池适用于需要控制并发线程数量的场景,而且相比于动态调整线程数量的线程池,更容易掌控。

       2.newSingleThreadExecutor

       newSingleThreadExecutor 是 Executors 工具类提供的一个静态方法,用于创建一个只有一个工作线程的线程池。该线程池的核心线程数和最大线程数都为1,因此它只能顺序执行任务,不会并发执行。这种线程池适用于需要顺序执行任务的场景,确保任务按照提交的顺序被执行。

       3.newCachedThreadPool

       newCachedThreadPool 是 Executors 工具类提供的一个静态方法,用于创建一个具有自动调整大小的线程池。该线程池的核心线程数为0,最大线程数为 Integer.MAX_VALUE,线程空闲时间为秒。这种线程池适用于执行很多短期异步任务的场景,其中线程池的大小需要根据当前任务的数量进行动态调整。

       4.newScheduledThreadPool

       newScheduledThreadPool 是 Executors 工具类提供的一个静态方法,用于创建一个具有固定大小的、支持定时及周期性任务执行的线程池。该线程池的核心线程数是固定的,而且线程池支持定时任务(ScheduledTask)的执行,例如定时执行任务或以固定的周期执行任务。

       DelayedWorkQueue

       DelayedWorkQueue 并不是一个具体的线程池工作队列的类,而是一个接口,属于 Java 中的 java.util.concurrent 包。该接口继承自 BlockingQueue 接口,用于表示支持延迟元素的工作队列。

       在 Java 中,延迟队列(DelayedQueue)是一种特殊的队列,其中的元素只有在其指定的延迟时间过去后才能够被消费。DelayedWorkQueue 接口定义了对延迟元素进行操作的方法,常见的实现类是 DelayQueue。

       以下是DelayedWorkQueue 接口的主要方法:

       DelayedWorkQueue 主要用于在具有时间限制的任务调度场景中,例如实现定时任务的执行。实现了 Delayed 接口的元素必须提供一个 getDelay 方法,该方法返回该元素还需要延迟的时间。

java常用的几种线程池实例讲解

       下面给你介绍4种线程池:

1、newCachedThreadPool:

       底层:返回ThreadPoolExecutor实例,corePoolSize为0;maximumPoolSize为Integer.MAX_VALUE;keepAliveTime为L;unit为TimeUnit.SECONDS;workQueue为SynchronousQueue(同步队列)

       通俗:当有新任务到来,则插入到SynchronousQueue中,由于SynchronousQueue是同步队列,因此会在池中寻找可用线程来执行,若有可以线程则执行,若没有可用线程则创建一个线程来执行该任务;若池中线程空闲时间超过指定大小,则该线程会被销毁。

       适用:执行很多短期异步的小程序或者负载较轻的服务器

2、newFixedThreadPool:

       底层:返回ThreadPoolExecutor实例,接收参数为所设定线程数量nThread,corePoolSize为nThread,maximumPoolSize为nThread;keepAliveTime为0L(不限时);unit为:TimeUnit.MILLISECONDS;WorkQueue为:new LinkedBlockingQueue<Runnable>() 无解阻塞队列

       通俗:创建可容纳固定数量线程的池子,每隔线程的存活时间是无限的,当池子满了就不在添加线程了;如果池中的所有线程均在繁忙状态,对于新任务会进入阻塞队列中(无界的阻塞队列)

       适用:执行长期的任务,性能好很多

3、newSingleThreadExecutor

       底层:FinalizableDelegatedExecutorService包装的ThreadPoolExecutor实例,corePoolSize为1;maximumPoolSize为1;keepAliveTime为0L;unit为:TimeUnit.MILLISECONDS;workQueue为:new LinkedBlockingQueue<Runnable>() 无解阻塞队列

       通俗:创建只有一个线程的线程池,且线程的存活时间是无限的;当该线程正繁忙时,对于新任务会进入阻塞队列中(无界的阻塞队列)

       适用:一个任务一个任务执行的场景

4、NewScheduledThreadPool:

       底层:创建ScheduledThreadPoolExecutor实例,corePoolSize为传递来的参数,maximumPoolSize为Integer.MAX_VALUE;keepAliveTime为0;unit为:TimeUnit.NANOSECONDS;workQueue为:new DelayedWorkQueue() 一个按超时时间升序排序的队列

       通俗:创建一个固定大小的线程池,线程池内线程存活时间无限制,线程池可以支持定时及周期性任务执行,如果所有线程均处于繁忙状态,对于新任务会进入DelayedWorkQueue队列中,这是一种按照超时时间排序的队列结构

       适用:周期性执行任务的场景

最后给你说一下线程池任务执行流程:

       当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。

       当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行

       当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务

       当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理

       当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程

       当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

scheduledthreadpoolexecutor 初始化多少个

       é€šè¿‡Executors,可以创建3种类型的ThreadPoolExecutor。

       - FixedThreadPool

       - SingleThreadExecutor

       - CachedThreadPool

       1.FixedThreadPool

       FixedThreadPool被称为可重用固定线程数的线程池。下面是FixedThreadPool的源代码实现。

       public static ExecutorService newFixedThreadPool(int nThreads) {

        return new ThreadPoolExecutor(nThreads, nThreads, 0L,

        TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());

       FixedThreadPool中多余的空闲线程会被立即终止。

       FixedThreadPool的execute()运行示意图如下所示。

       å¦‚果当前运行的线程数小于corePoolSize,则创建新线程来执行任务。

       å½“前运行的线程数等于corePoolSize,将任务加入LinkedBlockingQueue。

       çº¿ç¨‹æ‰§è¡Œå®Œ1中的任务后,会反复从阻塞队列中取任务执行。