关于java:尝试使用队列优化导出execl表任务

8次阅读

共计 1105 个字符,预计需要花费 3 分钟才能阅读完成。

前言

这周尝试做一个应用队列优化导出 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]
正文完
 0