尝试使用队列优化导出execl表任务

前言

这周尝试做一个使用队列优化导出execl表的issue,因为服务器内存原因,多个导出任务同时进行可能会导致内存溢出,使用队列进行依次导出,减少服务器压力。
尝试使用队列优化导出execl表任务_第1张图片
任务中还指出在队列等待时可以中途取消导出操作,此时应该是队列中删除相应实体.

队列

队列是一种先进先出的数据结构,区别于栈的先进后出,在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 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]

你可能感兴趣的:(java数据结构)