Java 定时任务,删除取消 Task

2018-10-23 10:19:53 +08:00
 vance

有个定时任务 scheduler.scheduleAtFixedRate,每隔 5s 去执行检查 redis 某个 key,存在则继续逻辑,不存在则不往下走,但这个定时任务还是一直运行的。有什么方法在 run 的时候如果 redis 的 key 不存在把这个 Task 删除掉或取消掉

5048 次点击
所在节点    Java
10 条回复
codingKingKong
2018-10-23 11:11:21 +08:00
没有试验, 试试这个?
```java
/**
* Terminates this timer, discarding any currently scheduled tasks.
* Does not interfere with a currently executing task (if it exists).
* Once a timer has been terminated, its execution thread terminates
* gracefully, and no more tasks may be scheduled on it.
*
* <p>Note that calling this method from within the run method of a
* timer task that was invoked by this timer absolutely guarantees that
* the ongoing task execution is the last task execution that will ever
* be performed by this timer.
*
* <p>This method may be called repeatedly; the second and subsequent
* calls have no effect.
*/
public void cancel()
```
gaius
2018-10-23 11:13:53 +08:00
用一个线程做?
kanepan19
2018-10-23 11:17:18 +08:00
当然可以 任务提交的时候会返回一个期望, 然后 future.cancel()
D3EP
2018-10-23 12:09:49 +08:00
每次执行完 task 再去注册 task 就行了。
D3EP
2018-10-23 12:10:04 +08:00
直接用 schedule。
vance
2018-10-23 14:45:56 +08:00
@D3EP 能否详细点,感谢
honeycomb
2018-10-23 18:43:08 +08:00
@vance 请仔细看 scheduler 的文档,里面提供的执行一次( one shot )的方法可以轻松的达到楼主的目的。

比如楼上 @kanepan19 提到的,你让它跑一个 callable 就能有返回值,然后下一个 trigger 根据这个返回值决定下一次怎么 schedule。

如果只用 runnable,找一个线程安全的变量来充当 flag 的作用。

还有更复杂的办法,比如你直接在项目里引用 quartz 库来达成目的也是没有问题的。

如果是 Java9,它的 forkjoin 也提供了一个定时触发异步人物的方法。
D3EP
2018-10-23 22:42:17 +08:00
```java
public class Main {
private static final ScheduledExecutorService EXECUTOR_SERVICE = Executors.newSingleThreadScheduledExecutor();
public static void main(String[] args) {
EXECUTOR_SERVICE.schedule(Main::task, 1, TimeUnit.SECONDS);
}
public static void task(){
if (true) {
System.out.println("Continue");
EXECUTOR_SERVICE.schedule(Main::task, 1, TimeUnit.SECONDS);
}else {
System.out.println("Exit");
}
}
}
```
mayowwwww
2018-10-23 23:59:39 +08:00
抛出一个运行时异常。
lihongjie0209
2018-10-24 08:54:20 +08:00
if(key not exist){

logger.info("直接退出执行就好了, 搞那么复杂")

return
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/500098

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX