您的位置:首页 > 编程语言 > Java开发

通过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("推送成功---------");

}
}
/**
* 通过线程池处理业务流程
* @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:获取活动的线程数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐