首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Java线程】“打工人”初识线程池及自定义线程池实战

    在Java中万物皆对象,那么线程也是一个对象,Java线程是对于操作系统线程的封装,创建Java线程也需要消耗操作系统的资源,因此就有了线程池。 原理 线程池创建 首先了解一下线程池创建以及工作原理。...1-> 当任务提交时,线程池先检查当前线程数;如果当前线程数小于核心线程数(corePoolSize),则创建线程并执行任务;比如开始提交任务时,线程数为0; 2->当线程任务不断增加时,创建的线程数等于核心线程数...,但是当前线程数小于最大线程数(maximumPoolSize),线程池会在核心线程的基础上继续创建线程(非核心线程)执行任务; 4->当任务继续增加时,线程池的线程数达到最大线程数;如果任务继续增加...*/ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { } } 除了以上四种拒绝策略,Java还支持自定义拒绝策略...taskMap = new LinkedHashMap(); idList.forEach(e -> taskMap.put(e, Boolean.FALSE)); //自定义线程池

    61840

    @Async应用自定义线程池

    @Async应用自定义线程池 自定义线程池,可对系统中线程池更加细粒度的控制,方便调整线程池大小配置,线程执行异常控制和处理。...在设置系统自定义线程池代替默认线程池时,虽可通过多种模式设置,但替换默认线程池最终产生的线程池有且只能设置一个(不能设置多个类继承AsyncConfigurer)。...自定义线程池有如下模式: 重新实现接口AsyncConfigurer; 继承AsyncConfigurerSupport; 配置由自定义的TaskExecutor替代内置的任务执行器。...executor.setThreadNamePrefix(threadNamePrefix); executor.setWaitForTasksToCompleteOnShutdown(true); // 使用自定义的跨线程的请求级别线程工厂类...@Async注解,使用系统默认或者自定义的线程池(代替默认线程池)。

    2.5K00

    (六)ThreadPoolExecutor自定义线程池

    上一篇中提到四种线程池的创建方式,最后还是会 new ThreadPoolExecutor(),所以 我们可以使用 new ThreadPoolExecutor()的方法创建自定义的线程。...(包括空闲线程),如果大于0,即使本地任务执行完也不会被销毁 2 maximumPoolSize 表示线程池能够容纳可同时执行的最大线程数 3 keepAliveTime 线程池中线程空闲的时间,当空闲时间达到该值时...corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。...int maxPoolSize = 5; //线程池维护线程的最大数量 long keepAliveTime = 1; //线程池维护线程所允许的空闲时间(解释:当线程池的数量超过...第10次 如果线程表示空闲的,就丢给调用这个线程的主线程去执行。

    3.2K10

    自定义Dictionary支持线程安全

    本文转载:http://www.cnblogs.com/kiddo/archive/2008/09/25/1299089.html 我们说一个数据结构是线程安全指的是同一时间只有一个线程可以改写它。...这样即使多个线程来访问它,它也不会产生对线程来说很意外的数据。 C#中的Dictionary不是线程安全的,我在下面这个例子中,把一个Dictionary对象作为了全局的static变量。...会有多个线程来访问它。所以我需要包装一下.net自带的Dictionrary. 发生冲突的部分无非是写的地方,所以在离写Dictionary最近的地方加一个锁。...我们看Dictionary的实现接口, 自定义一个线程安全的数据对象类。...: 线程安全集合类 非线程安全集合类 ConcurrentQueue Queue ConcurrentStack Stack ConcurrentBag List ConcurrentDictionary

    1.1K10

    Java线程池实现原理之自定义线程池(一)

    线程池好处: 1.降低资源 => 重复利用机制 (降低创建线程和销毁线程) 2.提高响应效率 => 当任务到达时,任务可以不需要等待去创建线程就可以执行 3.方便管理...使用线程池可以统一分配、调优、监控。 线程与任务的区别: 可以把线程理解成一个工作人员。而任务就是这个工作人员干的活。比如,餐厅的工作人员在为顾客传菜,传菜就是个任务。...一个任务可以是读取数据库中的一条记录, 也可以是FTP传输一批文件,FTP传输一个文件…… 1 //创建线程四种方式: 2 //1.可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程...3 //2.定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 4 //3.可定时线程池,支持定时及周期性任务执行。...,核心线程5个,最多创建5个线程 (只会创建5个线程,其他线程共享这5个线程) 25 ExecutorService executorService = Executors.newFixedThreadPool

    4.1K20

    java基础|自定义java线程池

    : keepAlveTime 的时间单位 workQueue: 在任务还没有执行前,保存Runnable任务的地方,也就是待执行任务队列 threadFactory: 线程工厂,可自定义线程生成的方式,...可以自定义名字等等 handler:在线程池和队列满的时候,如何处理新到来的任务 jdk自带线程池的缺陷 自带的线程池主要是通过Executors来初始化. newCachedThreadPool 通过...TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); } 自定义线程池...通过对自带的线程池的分析,我们知道自定义的线程池主要是对池子的最大数量和等待队列的最大数量做好限制,当然还有自定义的失败策略(以后单写个DEMO讲)代码如下: /** * @author https...,在小型开发中使用系统自带的线程池是没问题的,但有时候在生产环境中,特别是同步一些东西的时候,量级比较大,这时候使用系统自带的线程池难免会有些问题,这时候就需要自定义的线程池了,加油吧,少年!

    1.3K21

    【连载 06】自定义线程池(下)

    1.4.3 拒绝策略 拒绝策略在自定义线程池中作用发挥关键作用,通常对于初学者来说,使用默认策略是一种保险的方式。...其次该方法只在执行任务时执行,假设一段时间并没有新的任务提交,我们预想的核心线程数降低并不会被执行。有了这些API加持,相信各位一定可以掌握自定义线程池应对各类场景。...然后对于Java多线程实现的3种方式进行代码演示,然后快步进入Java线程池的重点学习。Java线程池分了两个部分:Java自带两种线程池实现和自定义线程池。...两者循序渐进,由浅入深,最终完成了Java线程池构造方法参数及其含义的学习。然后演示环境,笔者重点讲解了线程池创建线程的逻辑图、创建自定义线程池三个重要的对象参数,在实践中加深对知识点的理解。...最后演示了自定义参数对象核心逻辑实战,并且通过简单的案例帮助大家加强了对于自定义线程池源码的认识。

    4210

    【连载 05】自定义线程池(上)

    1.4 自定义线程池 现在你已经对创建和使用线程池有了初步了解,包括线程池创建参数的认识,现在我们将目光放在对象参数上,看它们在实际使用中,能达到什么效果,这样可以加深我们对这些参数的理解,帮助我们在后面的使用当中更加得心应手...线程安全。LinkedBlockingQueue 是线程安全的,可以在并发访问和修改场景中,保障线程安全。 阻塞操作。...根据我们之前对线程池创建新线程的分析,当向等待队列提交任务时,调用了java.util.concurrent.SynchronousQueue#offer(E)方法时返回false,所以会直接进入创建新的线程逻辑...当我们使用线程池处理大量异步任务的场景中,假如我们期望其中一部分异步任务优先执行,如果要实现这样的功能,就需要给线程池配置一个双端链表LinkedBlockingDeque。...,核心线程数0,最大线程数2,线程空闲时间60秒,任务队列为优先级阻塞队列 for (int i = 0; i < 5; i++) {// 提交5个任务 int

    8210

    优雅的自定义 ThreadPoolExecutor 线程池

    ThreadPoolExecutor 类 要自定义线程池,需要使用ThreadPoolExecutor类。...,也是线程池中常驻的线程数,线程池初始化时默认是没有线程的,当任务来临时才开始创建线程去执行任务 maximumPoolSize: 最大线程数,在核心线程数的基础上可能会额外增加一些非核心线程,需要注意的是只有当...推荐使用自定义线程池来避免该问题,这也是在使用线程池规范的首要原则!...尽量采用自定义的拒绝策略去进行兜底! 第四,线程池拒绝策略,自定义拒绝策略可以实现RejectedExecutionHandler接口。...关闭线程池 当线程池不再被引用并且工作线程数为0的时候,线程池将被终止。我们也可以调用shutdown来手动终止线程池。

    54920

    【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一、自定义线程池使用流程 二、自定义任务拒绝处理策略 三、完整代码示例 在博客 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask...一、自定义线程池使用流程 ---- 1 ....void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) { // 自定义任务被拒绝后的处理策略...RejectedExecutionHandler , 该处理器需要开发者自定义 , 实现 RejectedExecutionHandler 接口 , 并实现其 rejectedExecution 方法...java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class ThreadPool { /* 自定义线程池使用示例

    61600

    利用虚拟线程重写自定义异步功能

    在官方文档中,虚拟线程其中一个适用场景就是处理多个小异步任务时,本着随用随创建,用完即销毁的理念,不要进行过的的多线程管理和多线程同步设计。...我感觉这个非常适合处理异步任务,所以对原来的自定义异步关键字进行了新版本的开发。旧版本的功能也是根据 go 关键字功能进行开发的。...方案设计 下面分享方案设计的要点 没有采用无限创建虚拟线程的方式,还是用了一个最大并行虚拟线程数量限制 使用任务队列设计,使用了线程安全队列,存储待执行的任务 设计了同款daemon线程,功能与上篇自定义异步文章类似...,功能从任务队列中获取并执行任务 在通用的工具类中自定义关键字方法,功能向任务队列中添加任务 代码实现 任务队列 /** * 待执行任务队列,最大容量为MAX_WAIT_TASK...根据代码片段提供的信息,这个队列 queue 的元素类型是 Closure,这可能是一个自定义类型或者来自某个框架或库的特定类。

    17710

    自定义线程池理论知识部分

    一、线程池是什么 线程池是一种基于池化思想管理线程的工具。 创建/销毁是一个耗时操作,频繁使用会降低整体性能,使用线程池维护多个线程,可有效降低运行中性能开销,以及更好的管理线程。...Java中自定义线程池是自JDK1.5后出现的ThreadPoolExecutor。...线程池的组成 任务管理:(生产者角色) 线程管理:(消费者角色) 当提交任务后所经步骤: 直接申请线程执行该任务 缓冲到队列中等待线程执行 拒绝该任务 线程被统一维护在线程池内,根据任务请求进行线程分配...maximumPoolSize:线程池中允许的最大线程数,线程池中的当前线程数不会超过该值。...poolSize:线程池中当前线程的数量,其值为0的时候,意味着没有任何线程,线程池终止。

    63530

    如何优雅的自定义 ThreadPoolExecutor 线程池

    需要对症下药,建立自己的线程工厂类,灵活设置关键参数。 2、ThreadPoolExecutor 类 要自定义线程池,需要使用ThreadPoolExecutor类。...,也是线程池中常驻的线程数,线程池初始化时默认是没有线程的,当任务来临时才开始创建线程去执行任务 maximumPoolSize: 最大线程数,在核心线程数的基础上可能会额外增加一些非核心线程,需要注意的是只有当...推荐使用自定义线程池来避免该问题,这也是在使用线程池规范的首要原则!...尽量采用自定义的拒绝策略去进行兜底! 第四,线程池拒绝策略,自定义拒绝策略可以实现RejectedExecutionHandler接口。...5、关闭线程池 当线程池不再被引用并且工作线程数为0的时候,线程池将被终止。我们也可以调用shutdown来手动终止线程池。

    1.6K30
    领券