通过Java缓存线程池异步推送及处理业务流程
2018-03-16 23:42
357 查看
如今高并发的时代,什么项目都开始需求使用高并发了,灵活的使用Java线程池使用可以在很大程度上提升系统性能,处理效率,可管理化。这里本人简单写了一个通过Java线程池异步处理回调状态以及进行查询+入库的操作,这些耗时操作通过线程池可以大大提高并发量以及效率的处理,在上代码前先BB叨叨介绍2句。
整理总结了下共3大优点:
1:降低了系统资源的消耗。重复利创建的线程,降低系统消耗。
2:提高系统的响应速度,节省了线程的创建和销毁的时间。
3:让线程变成了可管理化。
用线程池ExecutorService异步处理:我理解ExecutorService其实就是内部的消息队列,JVM既充当生产者又充当消费者,这种应该适合非分布式的架构。
使用消息队列:消息队列(指MQ等),部署在其他机器,需要一定的网络消耗。
本着解耦的目的,使用后者更合理,因为一般JVM分配的内存是有限的,队列无法太长,并且单机无持久化,在崩溃时,会造成队列消息的丢失,所以该异步方法只运来做快速的异步处理事务,并且在高并发时记得给JVM分配足够大的空间。
线程池一共有4种:
1. newSingleThreadExecutor
创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
2.newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
经过我对4种线程池的研究,我强烈建议大家使用newCachedThreadPool 可缓存的线程池应该是最适用的,因为他会回收部分的空闲线程。
以下写了一个个人认为的newCachedThreadPool 写了一个异步处理业务流程及异步推送的业务例子,供大家学习参考:
/**
* 通过线程池处理异步推送
* @author guodong
* @version 2018-3-16
*/
public class RepostThread extends Thread {
public String url;
public String msg;
public Threadtest(String url,String msg)
{
this.url= url;
this.msg= msg;
} public void run() {
//执行异步推送方法
// httpuntil.respone(url,msg);
System.out.println("推送成功---------");
}
}
taskCount:线程池需要执行的任务数量。
completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。
largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。
getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不减。
getActiveCount:获取活动的线程数。
整理总结了下共3大优点:
1:降低了系统资源的消耗。重复利创建的线程,降低系统消耗。
2:提高系统的响应速度,节省了线程的创建和销毁的时间。
3:让线程变成了可管理化。
用线程池ExecutorService异步处理:我理解ExecutorService其实就是内部的消息队列,JVM既充当生产者又充当消费者,这种应该适合非分布式的架构。
使用消息队列:消息队列(指MQ等),部署在其他机器,需要一定的网络消耗。
本着解耦的目的,使用后者更合理,因为一般JVM分配的内存是有限的,队列无法太长,并且单机无持久化,在崩溃时,会造成队列消息的丢失,所以该异步方法只运来做快速的异步处理事务,并且在高并发时记得给JVM分配足够大的空间。
线程池一共有4种:
1. newSingleThreadExecutor
创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
2.newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
经过我对4种线程池的研究,我强烈建议大家使用newCachedThreadPool 可缓存的线程池应该是最适用的,因为他会回收部分的空闲线程。
以下写了一个个人认为的newCachedThreadPool 写了一个异步处理业务流程及异步推送的业务例子,供大家学习参考:
/**
* 通过线程池处理异步推送
* @author guodong
* @version 2018-3-16
*/
public class RepostThread extends Thread {
public String url;
public String msg;
public Threadtest(String url,String msg)
{
this.url= url;
this.msg= msg;
} public void run() {
//执行异步推送方法
// httpuntil.respone(url,msg);
System.out.println("推送成功---------");
}
}
/** * 通过线程池处理业务流程 * @author guodong * @version 2018-3-16 */ public class AcrThread extends Thread { public String url; public String vccid; public String msg; public Threadtest(String url,String vccid,String msg) { this.url= url; this.vccid=vccid; this.msg= msg; } public void run() { //执行异步请求获取返回结果 //String file = httpuntil.request(url,msg); //异步处理业务流程 //cs.insert(file,vccid,msg); System.out.println("业务处理成功---------"); } }
/** * 通过线程池异步推送状态及业务流程处理demo * @author guodong * @version 2018-3-16 */ public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService pool=Executors.newCachedThreadPool(); Thread t1 = new RepostThread (url,msg); Thread t2 = new AcrThread (url,vccid,msg); pool.execute(t1); pool.execute(t2); pool.shutdown(); //关闭线程池,线程池创建后如无需释放内存,则不关闭。但是要记住线程中不要写死循环,要加入线程的检测,和预留重置释放线程池的方法 } }使用线程池还有一个优势,即可以很好的监视线程的状态,这里简单的介绍一些线程池的属性,大家可以根据需要选择进行灵活运用:
taskCount:线程池需要执行的任务数量。
completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。
largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。
getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不减。
getActiveCount:获取活动的线程数。
相关文章推荐
- Java中在特定区间产生随机数 (2009-03-26 13:31:49)转载▼ 标签: 杂谈 生成指定范围内的随机数 这个是最常用的技术之一。程序员希望通过随机数的方式来处理众多的业务逻辑,测试
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- java如何异步方式处理业务逻辑
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- 网络图片异步加载(用到多线程(线程池),java回调机制,图片缓存,图片的动画)
- java android异步编程小技巧,简洁易懂业务异步流程设计
- 前端通过AJAX提交数据,后台PHP处理数据实现异步操作基本流程
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- JAVA 线程池的创建 以及异步线程池的使用
- 使用线程池处理异步任务
- 海量数据处理系列之(一)Java线程池使用
- Java异常解读以及通过业务逻辑解决异常的方式
- 用户登记与满意度评估的业务流程处理
- java通过服务器下载文件(这是根据我自己当时业务所需写的,如有需要请自己借鉴拷贝必要部分)
- 微信小程序中使用Promise进行异步流程处理
- Android异步加载图像小结 (含线程池,缓存方法)
- Java Executor并发框架(十三)Executor框架线程池关于异常的处理
- android 异步图片加载四之handler+线程池+消息队列模式+缓存