V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
vance
V2EX  ›  Java

Java 定时任务,删除取消 Task

  •  
  •   vance · Oct 23, 2018 · 5832 views
    This topic created in 2756 days ago, the information mentioned may be changed or developed.

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

    10 replies    2018-10-24 08:54:20 +08:00
    codingKingKong
        1
    codingKingKong  
       Oct 23, 2018
    没有试验, 试试这个?
    ```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
        2
    gaius  
       Oct 23, 2018
    用一个线程做?
    kanepan19
        3
    kanepan19  
       Oct 23, 2018
    当然可以 任务提交的时候会返回一个期望, 然后 future.cancel()
    D3EP
        4
    D3EP  
       Oct 23, 2018
    每次执行完 task 再去注册 task 就行了。
    D3EP
        5
    D3EP  
       Oct 23, 2018
    直接用 schedule。
    vance
        6
    vance  
    OP
       Oct 23, 2018
    @D3EP 能否详细点,感谢
    honeycomb
        7
    honeycomb  
       Oct 23, 2018 via Android
    @vance 请仔细看 scheduler 的文档,里面提供的执行一次( one shot )的方法可以轻松的达到楼主的目的。

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

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

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

    如果是 Java9,它的 forkjoin 也提供了一个定时触发异步人物的方法。
    D3EP
        8
    D3EP  
       Oct 23, 2018
    ```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");
    }
    }
    }
    ```
    imwxxxcxx
        9
    imwxxxcxx  
       Oct 23, 2018   ❤️ 1
    抛出一个运行时异常。
    lihongjie0209
        10
    lihongjie0209  
       Oct 24, 2018
    if(key not exist){

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

    return
    }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2993 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 07:20 · PVG 15:20 · LAX 00:20 · JFK 03:20
    ♥ Do have faith in what you're doing.