java ThreadPoolExecutor使用方法简单介绍
java ThreadPoolExecutor
前言:
在项目中如果使用发短信这个功能,一般会把发短信这个动作变成异步的,因为大部分情况下,短信到底是发送成功或者失败,都不能影响主流程。当然像发送MQ消息等操作也是可以封装成异步操作的。
使用基本的New Thread
如果想一个操作变成异步的,可以直接new thread,然后在run方法中实现业务操作即可。例如:
new Thread(new Runnable() { public void run() { //发短信、发MQ消息等 } });
但是这种方式有几个缺点。
1.每次都会new一个线程,执行完后销毁,不能复用;
2.如果系统的并发量刚好比较大,需要大量线程,那么这种每次new的方式会抢资源的。
ThreadPoolExecutor
我们可以使用jdk1.5中的ThreadPoolExecutor来封装异步操作。ThreadPoolExecutor的好处是可以做到线程复用,并且使用尽量少的线程去执行更多的任务,效率和性能都相当不错。demo代码如下:
public class ThreadPool { private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 12, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000), new ThreadPoolExecutor.AbortPolicy()); public static ThreadPoolExecutor getThreadPool() { return threadPool; } }
参数介绍
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { }
corePoolSize:当workQueue队列中的元素还未到达最大值时,corePoolSize表示的池中线程数量的最大值;
maximumPoolSize:线程池中允许的最大线程数;
keepAliveTime:当前池中的线程数如果超过了corePoolSize,那么超出那些线程如果空闲太久了,应该需要销毁的。keepAliveTime就是的是这些线程的最大空闲时间;
unit:keepAliveTime的时间单位;
workQueue:当池中线程数的数量已经达到了corePoolSize,那么如果请求还继续过来,会把请求对应的task放入队列中;
handler:当workQueue满了,池中的线程数又达到了maximumPoolSize,这个时候已经没有多余的资源处理请求了,需要RejectedExecutionHandler 来处理。拒绝处理或者丢弃任务等等。
执行过程
当没有请求时,线程池中没有任何线程;
当有请求时,创建线程,一直到池中的线程数等于corePoolSize;
如果请求太多,需要更多的线程来处理的话,ThreadPoolExecutor选择把请求放入队列中,暂时不新建线程;
如果workQueue也满了,ThreadPoolExecutor会继续创建线程,直到线程数量跟maximumPoolSize相等;
线程数达到maximumPoolSize了,同时workQueue也慢了,就只能把请求丢给RejectedExecutionHandler 来处理。
备注
使用ThreadPoolExecutor时,需要根据自己的业务情况,适当的指定参数值的大小。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
Java ThreadPoolExecutor的参数深入理解
Java ThreadPoolExecutor的参数深入理解 一.使用Executors创建线程池 之前创建线程的时候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()这三个方法.当然Executors也是用不同的参数去new ThreadPoolExecutor 1. newFixedThreadPool() 创建线程数固定大小的线程池. 由于使用了LinkedBlo
-
java中Executor,ExecutorService,ThreadPoolExecutor详解
java中Executor,ExecutorService,ThreadPoolExecutor详解 1.Excutor 源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /** * Executes the given command at some time in the future. The command * may execute in a new thread, in a pooled thre
-
Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能
java.util.concurrent.ScheduledThreadPoolExecutor 是JDK1 .6之后自带的包,功能强大,能实现定时器和延时加载的功能 各类功能和处理方面优于Timer 1.定时器: ScheduledThreadPoolExecutor 有个scheduleAtFixedRate(command, initialDelay, period, unit) ;方法 command: 执行的线程(可自己New一个) initialDelay:初始化执行的延时时间 p
-
Java ThreadPoolExecutor 线程池的使用介绍
Executors Executors 是一个Java中的工具类. 提供工厂方法来创建不同类型的线程池. 从上图中也可以看出, Executors的创建线程池的方法, 创建出来的线程池都实现了 ExecutorService接口. 常用方法有以下几个: newFixedThreadPool(int Threads): 创建固定数目线程的线程池, 超出的线程会在队列中等待. newCachedThreadPool(): 创建一个可缓存线程池, 如果线程池长度超过处理需要, 可灵活回收空闲线程(60
-
详解Java并发包中线程池ThreadPoolExecutor
一.线程池简介 线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供更好的性能,在不使用线程池时候,每当需要执行异步任务的时候直接new一个线程来运行的话,线程的创建和销毁都是需要开销的.而线程池中的线程是可复用的,不需要每次执行异步任务的时候重新创建和销毁线程:②线程池提供一种资源限制和管理的手段,比如可以限制线程的个数,动态的新增线程等等. 在下面的分析中,我们可以看到,线程池使用一个Integer的原子类型变量来记录线程池状态和线程池中的线程数量,通过线程池状态来控制任
-
java中ThreadPoolExecutor常识汇总
线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的.ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法: // 七个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,
-
java 定时器线程池(ScheduledThreadPoolExecutor)的实现
前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通ThreadPoolExecutor. 特点说明 1.构造函数 public ScheduledThreadPoolExecutor(int corePoolSize) { // 对于其他几个参数在ThreadPoolExecutor中都已经详细分析过了,所以这里,将不再展开 // 这里我们可以看到调用基类
-
java ThreadPoolExecutor 并发调用实例详解
java ThreadPoolExecutor 并发调用实例详解 概述 通常为了提供任务的处理速度,会使用一些并发模型,ThreadPoolExecutor中的invokeAll便是一种. 代码 package test.current; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util
-
Java线程池ThreadPoolExecutor原理及使用实例
引导 要求:线程资源必须通过线程池提供,不允许在应用自行显式创建线程: 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题.如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗内存或者"过度切换"的问题. 线程池介绍线程池概述 线程池,顾名思义是一个放着线程的池子,这个池子的线程主要是用来执行任务的.当用户提交任务时,线程池会创建线程去执行任务,若任务超过了核心线程数的时候,会在一个任务队列里进行排队等待,这个详细流程,我们会后面细
-
java ThreadPoolExecutor使用方法简单介绍
java ThreadPoolExecutor 前言: 在项目中如果使用发短信这个功能,一般会把发短信这个动作变成异步的,因为大部分情况下,短信到底是发送成功或者失败,都不能影响主流程.当然像发送MQ消息等操作也是可以封装成异步操作的. 使用基本的New Thread 如果想一个操作变成异步的,可以直接new thread,然后在run方法中实现业务操作即可.例如: new Thread(new Runnable() { public void run() { //发短信.发MQ消息等 } }
-
java ThreadPoolExecutor使用方法简单介绍
java ThreadPoolExecutor 前言: 在项目中如果使用发短信这个功能,一般会把发短信这个动作变成异步的,因为大部分情况下,短信到底是发送成功或者失败,都不能影响主流程.当然像发送MQ消息等操作也是可以封装成异步操作的. 使用基本的New Thread 如果想一个操作变成异步的,可以直接new thread,然后在run方法中实现业务操作即可.例如: new Thread(new Runnable() { public void run() { //发短信.发MQ消息等 } }
-
Atom-IDE 的使用方法简单介绍
Atom-IDE 的使用方法简单介绍 今日,GitHub 宣布与 Facebook 合作推出了 Atom-IDE -- 它包括一系列将类 IDE 功能带到 Atom 的可选工具包. 初次发布的版本包括更智能.感知上下文的自动完成:导航功能,如大纲视图和 goto-definition,以及其他有用的功能:还包括错误.警告提醒和格式化文档功能. 查看 Atom 博客以了解更多. Atom-IDE 包括适用于 C#, Flow, Java, JavaScript, PHP, 和 TypeScript
-
Java ThreadPoolExecutor线程池有关介绍
目录 为什么要有线程池? 线程池状态 ThreadPoolExecutor核心参数 corePoolSize maximumPoolSize keepAliveTime unit workQueue threadFactory handler 关闭线程池的方式 为什么不推荐使用Executors去创建线程池 为什么要有线程池? 在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,所以要尽可能减少创建和销毁线程的次数.由于没有线程创建和销毁时的消耗,可以提高系统响应速度可以对
-
Java框架入门之简单介绍SpringBoot框架
前言 Spring都包含了哪些部分呢? 主要包含Spring Boot.Spring Framework.Spring Data.Spring Cloud.Spring Cloud Data Flow.Spring Security.Spring Batch等众多项目.在spring的官网中对其有详细的介绍. 一.SpringBoot是什么? SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,
-
java Object wait方法详细介绍
java Object wait方法 当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁. 但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务.在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码.等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,
-
Java中List的使用方法简单介绍
Java中的List就是一种集合对象,将所有的对象集中到一起存储.List里面可以放任意的java对象,也可以直接放值. 使用方法很简单,类似于数组. 使用List之前必须在程序头引入java.util.* import java.util.*; public class list { public static void main(String args[]) { List a=new ArrayList(); a.add(1);//在LIST a中添加1 System.out.println
-
Java中ArrayList的使用方法简单介绍
ArrayList没有封装好的去重方法,比如对于一个[2, 5, 2, 3, 2, 4]的ArrayList,我要去除其中的重复的元素, 我也不想把语句也这么长,也不想用for循环的方法去重,那么可以先考虑把ArrayList转化为一个临时的HashSet,再把这个临时的HashSet转化回ArrayList,因为HashSet里面的元素是不可重复的嘛!至于什么是ArrayList与HashSet,在<详解java中的Collections类>已经说得很清楚了,这里不再赘述. 你可以这样写:
-
Java自动拆装箱简单介绍
在面试过程中,常常会有面试官问到基础的问题的时候都会问到Java的拆装箱,关于这个问题其实不是很难,但是如果平时进行自学的时候不是注意,就可能一脸懵逼,所以笔者就这个问题进行一些总结,共同促进! 一.拆装箱概念 所谓的拆装箱,就是自从JDK1.5之后,java的基本类型和引用类型之间的相互转换. 1.1拆箱 拆箱就是把Long,Integer,Double,Float 等将基本数据类型的首字母大写的相应的引用类型转化为基本数据类型的动作就叫拆箱. 1.2装箱 装箱就是把byte ,int ,sh
-
java同步开篇入门简单介绍
概览 这一篇的内容是一个大概的介绍,大致包含三大主题:java中的锁.同步器.分布式锁,大致讲的内容如下: (1)volatile (2)synchronized (3)AQS及Condition (4)ReentrantLock (5)ReentrantReadWriteLock (6)StampedLock (7)CountDownLatch (8)Semaphore (9)CyclicBarrier (10)Phaser (11)Mysql实现分布式锁 (12)Redis实现分布式锁 (1
随机推荐
- PHP通过session id 实现session共享和登录验证的代码
- 浅谈Spring 重定向指南
- 在Linux系统中安装Go语言的详细教程
- Linux od命令详细介绍及用法实例
- 在Python的Django框架中加载模版的方法
- WIN32程序获取父进程ID的方法
- nodejs个人博客开发第六步 数据分页
- jQuery实现按比例缩放图片的方法
- php5.4传引用时报错问题分析
- jquery UI Datepicker时间控件的使用方法(终结版)
- C++ 计数排序实例详解
- javascript实现日期格式转换
- 探讨:关闭浏览器后,php脚本会不会继续运行
- C#修改IIS站点framework版本号的方法
- Ubuntu 16.04安装微信的过程记录
- spring boot 即时重新启动(热更替)使用说明
- react koa rematch 如何打造一套服务端渲染架子
- PHP常用字符串函数小结(推荐)
- selenium+python自动化测试之鼠标和键盘事件
- 使用Python开发SQLite代理服务器的方法