首页 > 其他分享 >自定义线程池详解

自定义线程池详解

时间:2023-04-08 14:22:07浏览次数:53  
标签:同步 自定义 list Future 线程 大小 page 详解

自定义线程池

ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, 
				new ArrayBlockingQueue<Runnable>(5));

第一个参数:核心线程池大小,默认创建后就不会销毁,需要设置allowCoreThreadTimeOut为true时会销毁
第二个参数:线程池最大大小
第三个参数:线程池最大空闲时间(线程空闲下来多久自动释放)
第四个参数:时间单位
第五个参数:线程阻塞队列

image

  • 对上图的详解

1 提交任务到线程池:executor.execute(new Runable());

2 判断核心线程池大小是否已满,否,执行任务

3 是,判断队列是否已满,否,进行等待队列

4 是,判断最大线程池大小是否已满,否,执行任务

5 是,执行拒绝策略,对外就是抛出异常

提供的现成可使用的线程池

Executors.newCachedThreadPool(无界线程池,自动线程回收)

Executors.newFixedThreadPool(固定大小的线程池)

Executors.newSingleThreadExecutor(单一后台线程)

我做过的真实案例-> 线程池应用

  • 场景:数据库大量数据(百万级)需要同步至Elasticsearch库,目前采用的单线程的方式,每次从数据库中读取5000条数据同步至Elasticsearch库,循环n次,直到数据库读取不到数据则同步完成。 缺点:此过程需要2小时时间。

  • 改造:需要将同步时间缩短,同步不能使ES崩掉

  • 方案:采用线程池的方式,配置如下:

核心线程池大小为2 最大线程池大小为2 线程池最大空闲时间 0秒 队列大小 1000, 队列大小的选择:1000 * 5000 = 500万 数据不超过5百万

  • 实现代码:每同步完成一次需要返回具体插入了ES库的条数,然后实现累加可算出本次同步一共同步了多少条,JDK提供了Future对象

    do {
    	List<JSONObject> list = cilSettOracleMapper.findCilSettByDate(sysDate, page * SIZE, (page + 1) * SIZE);
    	if(list != null && list.size() > 0){
    		Future<Long> future = ThreadManager.executorService.submit(new Callable<Long>() {
    			@Override
    			public Long call(){
    				log.debug("线程名:" + Thread.currentThread().getName() + "-->" + bulkRequestSize);
    				return ESClient.getESClient().indexCilSettOracle(request, list, scanTransService, merInfoMapper, bulkRequestSize);
    			}
    		});
    		futrueList.add(future);
    	}else{
    		break;
    	}
    	log.info("indexCilSett page:" + page + ",bulkRequestSize: " + bulkRequestSize);
    	page++;
    } while (true);
    
    Long futureRequestSize = 0L;
    for(Future<Long> f : futrueList) {
    	try {
    		futureRequestSize += f.get();
    	} catch (InterruptedException | ExecutionException e) {
    		log.error("执行Future的get方法发生异常", e);
    	}
    }
    
  • 上述注意部分:第一次接触Future类,当时直接在循环里调用future.get()方法获取数据,发现线程是一个一个按照顺序去执行,后来了解到get()方法会阻塞线程,于是有了上述的先将Future对象有list存起来,然后循环拿结果。

  • Future类讲解的比较好的:https://www.cnblogs.com/dolphin0520/p/3949310.html

标签:同步,自定义,list,Future,线程,大小,page,详解
From: https://www.cnblogs.com/liyong888/p/17298473.html

相关文章

  • Java-SPI机制详解
    Java之SPI机制详解1:SPI机制简介SPI全称是ServiceProviderInterface,是一种JDK内置的动态加载实现扩展点的机制,通过SPI技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是一种设计理念。2:SPI原理JavaSPI实际上是基于接口的编程+策略模......
  • 内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
    原文:https://blog.csdn.net/yyzsyx/article/details/129576582文章目录一、篇头二、内核部分2.1源码下载2.1.1官网2.1.2镜像站点2.1.3代码下载2.2编译2.2.1设置工具链2.2.2配置2.2.3make2.2.4编译成功三、busybox部分3.1源码下载3.2编译3.2.1配置3.2.3编译3.2.4查......
  • 面试题百日百刷-HBase中HTable API有没有线程安全问题,在程序是单例还是多例?
    锁屏面试题百日百刷,每个工作日坚持更新面试题。请看到最后就能获取你想要的,接下来的是今日的面试题: 1.HBase内部机制是什么?Hbase是一个能适应联机业务的数据库系统物理存储:hbase的持久化数据是将数据存储在HDFS上。存储管理:一个表是划分为很多region的,这些region分布式地......
  • 在android的fragment中使用子线程查询的数据如何实时更新在主界面的listview中
    主要是使用handler来对ui界面进行实时更新 public class YourFragment extends Fragment {    private ListView mListView;    private YourAdapter mAdapter = new YourAdapter(getContext(), new ArrayList<YourData>());//注意这一步的初始化如果闪......
  • Ioc自定义注册器
     相当于@ComponentScan  ......
  • 【C】动态内存管理 malloc calloc relloc free 函数详解
    【C】动态内存管理@[toc]本章重点为什么存在动态内存分配动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题1.为什么存在动态内存分配我们已经掌握的内存开辟方式有:#include<stdio.h>intmain(){ intnum=10;//向内存申请了4个字节的空间 int......
  • 协程 goroutine,线程,进程,GPM,的介绍
    前言:进程,线程,协程,并发,并行介绍正文:线程,进程介绍:1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间4.调度和切换:线程上......
  • SQL Server STUFF() 函数详解
    STUFF():在SQLServer中,stuff()函数用于从源字符串中删除给定长度的字符序列,并从指定的起始索引插入给定的字符序列。用法:STUFF(source_string,start,length,change_string)source_string:字符数据start:指定删除和插入的开始位置length:指定要删除的字符数......
  • vue中 ref、$refs、$emit、$on、$bus、$off 详解和使用
    1.ref和 $refsref被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象上,如果是在普通的DOM元素上使用,引用指向的就是DOM元素,如果是在子组件上,引用就指向组件的实例。$refs是一个对象,持有已注册过ref的所有的子组件。ref用法:ref加在普通的元素......
  • vue导入处理Excel表格详解
    https://blog.csdn.net/m0_46309087/article/details/125022676 目录1.前言2.vue导入Excel表格2.1使用ElementUI中的upload组件2.2使用input文件上传3.总体代码与效果4.总结1.前言  最近遇到前端导入并处理excel表格的情况,趁此机会刚好研究一下vue导入并处理excel数据;......