关于java控件-TimerTask通过exe4j做成软件后的时间问题

起床搬砖 2018-09-18 04:01:54
我设置了一个程序让它固定在3点的时候执行里面的run()方法,但是在我4点开启这软件的时候它并没有等到第二天的3点跑而是直接执行了run()里面的方法并且运行不完善,反之我在2点的时候开启这个软件却能在3点的时候准确无误的跑下这个程序。各大神,可以说说这是啥原理以及怎么解决吗?
因为一些公司信息,附上基本的代码,感谢大神帮我看看~
public static List ls3 = new ArrayList<>();

public static void main(String[] args) {
cronJob(15, 00, 00);
cronJob(15, 01, 00);
}

public static void cronJob(int shi, int fen, int miao) {
Calendar cal = Calendar.getInstance();
// 每天定点执行
cal.set(Calendar.HOUR_OF_DAY, shi);
cal.set(Calendar.MINUTE, fen);
cal.set(Calendar.SECOND, miao);

Timer timer = new Timer();
timer.schedule(new TimerTask() {

public void run() {
Workbook wb = null;
Sheet sheet = null;
Row row = null;
List<Map<String, String>> list = null;
String cellData = null;

String files = "C:\\Users\\Administrator\\Desktop\\tt";
File file = new File(files);
// 取得文件列表
File[] dir = file.listFiles();

// 删除单条数据
if (ls3.size() > 0) {
for (int l = 0; l < ls3.size(); l++) {
Map<String, String> deleteResult = api.deleteData((String) ls3.get(l));
System.out.println("删除单条数据:");
System.out.println(deleteResult);
}
}

// 遍历文件夹下的所有文件
for (int i = 0; i < dir.length; i++) {
// 取得文件名称
String filePath = files + "\\" + dir[i].getName();
String columns[] = { "Shift&Line", "Order No", "Item No.", "Mat des", "MRP ctrlor", "Group",
"Priority", "order qty.", "output", "plan hours", "Operators", "Credit Time", "Start Date",
"Start time", "Weight", "Week", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Remark" };
wb = readExcel(filePath);
if (wb != null) {
// 用来存放表中数据
list = new ArrayList<Map<String, String>>();
// 获取第一个sheet
sheet = wb.getSheetAt(0);
// 获取最大行数
int rownum = sheet.getPhysicalNumberOfRows();
// 获取第一行
row = sheet.getRow(0);
// 获取最大列数
int colnum = row.getPhysicalNumberOfCells();
for (int j = 1; j < rownum; j++) {
Map<String, String> map = new LinkedHashMap<String, String>();
row = sheet.getRow(j);
if (row != null) {
cellData = (String) getCellFormatValue(row.getCell(0));
if ("Shift&Line".equals(cellData) || "".equals(cellData)) {
continue;
}
for (int k = 0; k < colnum; k++) {
cellData = (String) getCellFormatValue(row.getCell(k));
map.put(columns[k], cellData);
}
} else {
break;
}
list.add(map);
}
}
// 遍历解析出来的list
final List<String> ls2 = new ArrayList<String>();
for (Map<String, String> map : list) {
for (Entry<String, String> entry : map.entrySet()) {
ls2.add(entry.getValue());
}
}

// 拆分
List<List<String>> result = createList(ls2, 24);
// 创建单条数据
for (int m = 0; m < (ls2.size() / 24); m++) {
List ls = new ArrayList<>();
for (int n = 0; n < 24; n++) {
ls.add(result.get(m).get(n));
}
Map<String, Object> create = new HashMap<String, Object>() {
{
// 线号
put("_widget_1526028234352", new HashMap<String, Object>() {
{
put("value", ls.get(0));
}
});

。省略

// Sun
put("_widget_1530256865998", new HashMap<String, Object>() {
{
put("value", ls.get(22));
}
});
// Remark
put("_widget_1526026292045", new HashMap<String, Object>() {
{
put("value", ls.get(23));
}
});
}
};
Map<String, Object> createData = api.createData(create);
ls3.add(createData.get("_id"));
System.out.println("创建单条数据:");
System.out.println(createData);
}
}
}
}, cal.getTime(), 24 * 60 * 60 * 1000);
}
...全文
233 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
起床搬砖 2018-09-19
  • 打赏
  • 举报
回复
感谢两位的帮忙
java1357924680 2018-09-18
  • 打赏
  • 举报
回复
参考
timer问题
起床搬砖 2018-09-18
  • 打赏
  • 举报
回复
不对啊。。。我仔细看了一下,我这个就是第三个方法。。
起床搬砖 2018-09-18
  • 打赏
  • 举报
回复
引用 1 楼 HeiBoyYang 的回复:
schedule的4种用法 1.schedule(task, time) task(TimerTask):要执行的任务 time(Date):执行的时间(什么时候去执行),只执行一次,如果time早于现在的时间,就会立即执行。 2.schedule(task, delay) task(TimerTask):要执行的任务 delay(Long):多久后去执行,只执行一次。比如如果delay的值为2000,task就会在距离当前时间2秒后去执行。 3.schedule(task, time, period) task(TimerTask):要执行的任务 time(Date):第一次执行任务的时间 period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。 4.schedule(task, delay, period) task(TimerTask):要执行的任务 delay(Long):多久后去执行 period(Long):每隔多久执行一次
那二楼大神您的意思是让我改为第三种方法?然后让它每隔一天执行一次?
HeiBoyYang 2018-09-18
  • 打赏
  • 举报
回复
schedule的4种用法

1.schedule(task, time)

task(TimerTask):要执行的任务

time(Date):执行的时间(什么时候去执行),只执行一次,如果time早于现在的时间,就会立即执行。

2.schedule(task, delay)

task(TimerTask):要执行的任务

delay(Long):多久后去执行,只执行一次。比如如果delay的值为2000,task就会在距离当前时间2秒后去执行。

3.schedule(task, time, period)

task(TimerTask):要执行的任务

time(Date):第一次执行任务的时间

period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。

4.schedule(task, delay, period)

task(TimerTask):要执行的任务

delay(Long):多久后去执行

period(Long):每隔多久执行一次

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧