java查询进度_java进度信息打印工具ProgressUtil

java进度信息打印工具ProgressUtil

java进度信息打印工具ProgressUtil

有时需要批量处理任务,希望打印相关的任务处理信息。写了个工具类。先看效果,后贴代码。

任务进度信息打印效果如下:

a4eb15880c5d0083c7c4d8cee5239e0e.png

业务关键代码:

ProgressUtil pu = new ProgressUtil("导入数据", list.size());

for (Record record : list) {

in.put(1, record.getStr("mkid"));

//logger.info(record.getStr("mkid") + "开始");

reportMklbService.callProc(sql, in, out);

//logger.info(record.getStr("mkid") + "结束");

pu.finishOne("mkid:"+record.getStr("mkid"));

}

工具代码ProgressUtil.java:

package com.xpl.util;

import org.apache.log4j.Logger;

/***

* 进度工具

* @author xpl

*

*/

public class ProgressUtil {

private static final Logger logger = Logger.getLogger("");

// 工作内容

String title;

// 工作量化后总数量

int total;

// 已完成的数量

int finish = 0;

long startTime;

long preTime;

long nextTime;

//完成一项工作后是否自动休眠

boolean autoSleep = false;

//上一次休眠时长

long preSleepTime;

//休眠耗时。参考sleep()方法注释

long [] timeArr = {8000,3000,2000,1000,4000,5000,6000,7000,8000};

//完成指定数量。参考sleep()方法注释

int [] countArr = {1,10,20,40,60,80,100};

public ProgressUtil(String title, int total) {

this.title = title;

this.total = total;

startTime = System.currentTimeMillis();

preTime = startTime;

}

public ProgressUtil(String title, int total, boolean autoSleep) {

this(title, total);

this.autoSleep = autoSleep;

}

/***

* 失败一次,打印信息。

*/

public void failureOne(String errorMsg) {

logger.error(title + " | " + total + " / " + finish + " | " + "休眠时长:"+ preSleepTime +"|错误信息:"+errorMsg);

}

/***

* 完成一个任务后,打印信息

*/

public void finishOne() {

finishOne("");

}

/***

* 完成一个任务后,打印信息

* @param taskInfo

* 任务信息

*/

public void finishOne(String taskInfo) {

finish++;

long sleepTime = sleep();

nextTime = System.currentTimeMillis();

String str = title + " | 耗时" + getHs(nextTime - preTime) + " | " + total + " / " + finish;

str += " | 剩余时间:" + getHs(remainingTime());

str += " | " + taskInfo;

if(finish == total){

str += " | 总耗时" + getHs(nextTime - startTime);

}

if(sleepTime > 0){

str += " | 休眠" + getHs(sleepTime);

}

logger.info(str);

//System.out.println(str);

preTime = nextTime;

}

/***

* 耗时

* @param l

* @return

*/

public String getHs(long hs) {

if (hs < 1000) {

return hs + "毫秒";

} else if (hs < 1000 * 60) {

return (hs / 1000) + "秒";

} else if (hs < 1000 * 60 * 60) {

return (hs / (1000 * 60)) + "分" + ((hs % (1000 * 60)) / 1000) + "秒";

} else if (hs < 1000 * 60 * 60 * 60) {

return (hs / (1000 * 60 * 60)) + "时" + ((hs % (1000 * 60 * 60)) / (1000 * 60)) + "分";

}

return hs + "毫秒";

}

/***

* 自动休眠,autoSleep为true时开启。

* 默认:

* long [] timeArr = {0,1000,2000,3000,4000,5000,10000};

* int [] countArr = {1,3,5,10,20,50,100};

* 含义:完成数finish小于等于countArr[i]时,休眠timeArr[i]时长。

* finish 大于countArr[countArr.length - 1]时,休眠timeArr[timeArr.length - 1]时长。

*/

private long sleep(){

preSleepTime = 0;

if(autoSleep && finish < total){

int i = 0;

for (; i < countArr.length; i++) {

if(finish <= countArr[i]){

break;

}

}

try {

if(i < timeArr.length){

preSleepTime = timeArr[i];

}else{

preSleepTime = timeArr[timeArr.length - 1];

}

Thread.sleep(preSleepTime);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

return preSleepTime;

}

/***

* 估计剩余时间

* 先根据已完成任务数量,求完成一次的平均时间,然后根据待完成任务数估计完成所有任务剩余时间。

* @return

*/

public long remainingTime() {

return (nextTime - startTime)/finish * (total - finish);

}

}

autoSleep 如果为true,则每次完成任务后会自动休眠一段时间。这个主要是网络上批量爬取数据时,避免访问太过频繁被屏蔽时使用。

failureOne 一般在业务代码中try catch中使用,抛出异常或者有任务执行失败的标志时调用。可以清楚的知道哪个任务出错了。

例子:

/***

* 爬取并保持章节内容

* @param rm

* @param list

*/

public void crawlAndSaveContent(ResponseMap rm, List list) {

int size = list.size();

ProgressUtil pu = new ProgressUtil("更新章节内容", size, true);

for (Mulu mulu : list) {

try{

muluService.updateContent(rm, mulu);

} catch (Exception e) {

e.printStackTrace();

pu.failureOne(e.getMessage()+"|"+mulu.getUrl());

}

pu.finishOne(mulu.getUrl());

size--;

}

}

java进度信息打印工具ProgressUtil相关教程

Java多线程(5)JMM详解

Java多线程(5)JMM详解 JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等; 所有的变量都存储在主内存中 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该

蓝桥杯 2017年决赛 Java大学C组

蓝桥杯 2017年决赛 Java大学C组 蓝桥杯 2017年决赛 Java大学C组 #1 数位和 #2 数字划分 #3 树形显示 #4 小数第n位 #5 分考场 #6 合根植物 希望决赛题目不搞我 先挂 本题满分: 15分 问题描述 数学家高斯很小的时候就天分过人。一次老师指定的算数题目是:1+2+

JAVA基础(二)—— java开发工具选择及第一个程序

JAVA基础(二)—— java开发工具选择及第一个程序 正所谓工欲善其事必先利其器,一款好的开发工具能帮助我们更快、更好的完成开发任务。 1.Eclipse Eclipse做为一款开发源代码的Java扩展性开发平台,是行业内半数Java开发人员都会选择的开发工具(也是大多数

解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题

解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 在刚开始学习Java的过程中,考虑到记事本应用没有行号标识,不便于找对应的报错位置,且Eclipse对于新手来说又太强大,故选择使用Notepad++编写java程序。Notepad++可以通过选定的语言自动进行相

#Java教程:Date、DateFormat、SimpleDateFormat @FDDLC

#Java教程:Date、DateFormat、SimpleDateFormat @FDDLC Date类: Date date=new Date(); //无参构造:返回当前时间 System.out.println(date); long milliSecond = date.getTime(); //返回从时间基点以来的毫秒值。标准时间基点为:1970-01-01 00:00:00,东

JavaScript 立即执行函数

JavaScript 立即执行函数 1.什么是立即执行函数 声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行; 立即执行函数的创建步骤,看下图: 2.立即函数形式 接下来看立即执行函数的两种常

【刷题1】LeetCode 139. 单词拆分 java题解

【刷题1】LeetCode 139. 单词拆分 java题解 人生的大起大落就在一瞬间:吃完饭回来看到粉丝+1并为此开心,过了几分钟再看就没有了。 另外下午真的是诸事不宜啥也不想学的时间段。(这题直接先看题解吧 1.题目 2.分析 转移方程: dp[i]表示字符串的前i个字符能

开票后填写文本为开票信息后下发其他系统的增强。(VF02)

开票后填写文本为开票信息后下发其他系统的增强。(VF02) 开票后填写文本为开票信息后下发其他系统的增强。( VF02 ) 程序: RV60AFZZ 子历程: userexit_save_document_prepare. 因为这个函数用的比较频繁,直接改代码的话影响会比较大,所以在这拷了一个,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值