SingleThreadScheduledExecutor 运行 计划
SingleThreadScheduledExecutor running schedule
我有一个包含 singleThreadScheduledExecutor 的 运行 方法。目标是在早上 6 点到晚上 8 点之间每 30 分钟运行。如果那天是周末或在这些时间之外,运行time 程序应该在日志中添加一条消息并等待 30 分钟后再试。
然而,当服务器启动我的程序并且它在正确的时间范围内时,(在这种情况下,假设它在早上 7 点第一次尝试 运行 程序)当它经过指定时间它仍然会 运行(在这种情况下,它会在晚上 830 点再次尝试,但仍然会 运行)。通过它进行调试会通过 if 语句并简单地忽略大小写。我还发现,如果我 运行 我的程序在正确的时间之外,它会在日志中添加一条错误消息,但当它回到正确的时间范围内时,它将继续只记录错误而不是 运行ning 程序。
因此我的问题是:在我根本没有看到的逻辑中是否遗漏了什么?有没有 better/more 有效的方法来做到这一点?
提前致谢。
下面附上代码
public final void run() {
final Calendar cal = Calendar.getInstance();
exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
if (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7) {
Globals.addMessage("Non-scheduled work day, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else if (cal.get(Calendar.HOUR_OF_DAY) < 6 || cal.get(Calendar.HOUR_OF_DAY) > 20) {
Globals.addMessage("Non-scheduled work hours, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else {
running = true;
Runtime rt = Runtime.getRuntime();
rt.exec(ServerVar.getVariable(ServerVars.PATH));
Globals.addMessage("Program is running.");
}
}
catch (IOException e) {
Globals.addMessage(e.toString());
}
}
}
, 0, 30, TimeUnit.MINUTES);
}
您一直在使用相同的 Calendar
。试试这个:
public final void run() {
exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
public void run() {
final Calendar cal = Calendar.getInstance();
try {
if (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7) {
Globals.addMessage("Non-scheduled work day, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else if (cal.get(Calendar.HOUR_OF_DAY) < 6 || cal.get(Calendar.HOUR_OF_DAY) > 20) {
Globals.addMessage("Non-scheduled work hours, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else {
running = true;
Runtime rt = Runtime.getRuntime();
rt.exec(ServerVar.getVariable(ServerVars.PATH));
Globals.addMessage("Program is running.");
}
}
catch (IOException e) {
Globals.addMessage(e.toString());
}
}
}
, 0, 30, TimeUnit.MINUTES);
}
我有一个包含 singleThreadScheduledExecutor 的 运行 方法。目标是在早上 6 点到晚上 8 点之间每 30 分钟运行。如果那天是周末或在这些时间之外,运行time 程序应该在日志中添加一条消息并等待 30 分钟后再试。
然而,当服务器启动我的程序并且它在正确的时间范围内时,(在这种情况下,假设它在早上 7 点第一次尝试 运行 程序)当它经过指定时间它仍然会 运行(在这种情况下,它会在晚上 830 点再次尝试,但仍然会 运行)。通过它进行调试会通过 if 语句并简单地忽略大小写。我还发现,如果我 运行 我的程序在正确的时间之外,它会在日志中添加一条错误消息,但当它回到正确的时间范围内时,它将继续只记录错误而不是 运行ning 程序。
因此我的问题是:在我根本没有看到的逻辑中是否遗漏了什么?有没有 better/more 有效的方法来做到这一点?
提前致谢。
下面附上代码
public final void run() {
final Calendar cal = Calendar.getInstance();
exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
if (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7) {
Globals.addMessage("Non-scheduled work day, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else if (cal.get(Calendar.HOUR_OF_DAY) < 6 || cal.get(Calendar.HOUR_OF_DAY) > 20) {
Globals.addMessage("Non-scheduled work hours, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else {
running = true;
Runtime rt = Runtime.getRuntime();
rt.exec(ServerVar.getVariable(ServerVars.PATH));
Globals.addMessage("Program is running.");
}
}
catch (IOException e) {
Globals.addMessage(e.toString());
}
}
}
, 0, 30, TimeUnit.MINUTES);
}
您一直在使用相同的 Calendar
。试试这个:
public final void run() {
exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
public void run() {
final Calendar cal = Calendar.getInstance();
try {
if (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7) {
Globals.addMessage("Non-scheduled work day, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else if (cal.get(Calendar.HOUR_OF_DAY) < 6 || cal.get(Calendar.HOUR_OF_DAY) > 20) {
Globals.addMessage("Non-scheduled work hours, please try again later.");
Globals.addMessage("Process aborted.");
running = false;
}
else {
running = true;
Runtime rt = Runtime.getRuntime();
rt.exec(ServerVar.getVariable(ServerVars.PATH));
Globals.addMessage("Program is running.");
}
}
catch (IOException e) {
Globals.addMessage(e.toString());
}
}
}
, 0, 30, TimeUnit.MINUTES);
}