前言

这周尝试做一个应用队列优化导出execl表的issue,因为服务器内存起因,多个导出工作同时进行可能会导致内存溢出,应用队列进行顺次导出,缩小服务器压力。

工作中还指出在队列期待时能够中途勾销导出操作,此时应该是队列中删除相应实体.

队列

队列是一种先进先出的数据结构,区别于栈的先进后出,在java中队列只作为接口呈现,个别应用链表实现其接口.
而后咱们须要定义一个实体ExportExcel来记录一次导出用到的一些参数。
而后还须要定义的一些导出参数是随机文件名filename,用于反馈后盾进度,响应HttpServletResponse.
定义一个服务类

/** * 对列入队 * @param exportExcel */void pull(ExportExcel exportExcel);/** * 执行循环导出办法 * @throws IOException */void export() throws IOException;/** * 队列是否为空 * @return */Boolean queueIsEmpty();

重构c层代码

// 新建一个对象ExportExcel exportExcel = new ExportExcel();// 传入参数......// 如果以后队列为空,入队并执行,如果队列不空,只入队if (this.exportQueueService.queueIsEmpty()) {  this.exportQueueService.pull(exportExcel);  this.exportQueueService.export();} else {  this.exportQueueService.pull(exportExcel);}

优先队列

而后去网上查找发现 java有一个PriorityQueue实现队列接口,称为优先队列。无限队列与队列的区别在于,,它的出队程序与元素的优先级无关,对优先队列调用出队办法,返回的总是优先级最高的元素。然而这并不象征这着队列曾经依照优先级从高到低的程序排好了队。

//创立优先队列PriorityQueue<Integer> numbers = new PriorityQueue<>();//入队两个元素numbers.offer(4);numbers.offer(2);System.out.println("PriorityQueue: " + numbers);//再入队一个元素numbers.offer(1);System.out.println("更新后的PriorityQueue: " + numbers);

输入后果

PriorityQueue: [2, 4]更新后的PriorityQueue: [1, 4, 2]