关闭 ScheduledExecutorService

Posted

技术标签:

【中文标题】关闭 ScheduledExecutorService【英文标题】:Shutting down a ScheduledExecutorService 【发布时间】:2020-11-22 09:15:40 【问题描述】:

所以我有一个不和谐的机器人,我试图每小时发送一条消息。我使用预定的执行程序服务使其部分工作。它从我说 !futureson 开始

我希望在发送 !futuresoff 时能够停止它

但是,我无法让它正常工作。这是我的代码:

    String[] args = event.getMessage().getContentRaw().split(" ");
    if (args[0].equalsIgnoreCase("!futuresOn")) 
    Color red = new Color(255, 0, 0);
    Color green = new Color(0, 204, 0);
       Runnable futRun = new Runnable() 
       public void run() 
        EmbedBuilder futuresBot = new EmbedBuilder();
        futuresBot.setAuthor("Futures Bot", null, event.getAuthor().getAvatarUrl());
   
        try 
    futuresBot.addField("**S&P 500**", getSPY(), false);
    futuresBot.addField("**NASDAQ**", getNASDAQ(), false);
    futuresBot.addField("**DOW**", getDOW(), false);
    if (getSPY().contains("+")) 
    futuresBot.setColor(green);
     
    else 
    futuresBot.setColor(red);
    
        
    catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
    
   
   
        futuresBot.setFooter("Cantina Capital", event.getGuild().getIconUrl());
        event.getChannel().sendMessage(futuresBot.build()).queue();
   
       
      
    ;
    
    exec.scheduleAtFixedRate(futRun, 0, 1, TimeUnit.HOURS);
    
    
    
    if (args[0].equalsIgnoreCase("!futuresoff")) 
    event.getChannel().sendMessage("Futures bot off.").queue();
    exec.shutdownNow();
    

我已经尝试了几种不同的方法,但我无法让它正常工作。它正在进入 !futuresoff 部分,因为它发送 Futures bot off 消息。我只希望它能够在发送 !futureson 时每小时发送一次消息,而不是在发送 !futuresoff 时发送消息。我也试过 ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(0);

我将不胜感激任何可以为我指明正确方向的帮助或人。

【问题讨论】:

看来你需要使用cancel,cf.duplicate ***.com/q/14889143/1827276 【参考方案1】:

首先,您应该将 scheduleAtFixedRate() 的结果保存在您的 Listener 类中。

ScheduledFuture scheduledFuture = null;

然后你可以在这个对象上使用cancel() 来阻止它。 您还应该在调度之前测试它是否为空,并在取消之前测试它是否设置:

String[] args = event.getMessage().getContentRaw().split(" ");
if (args[0].equalsIgnoreCase("!futuresOn")) 
    Color red = new Color(255, 0, 0);
    Color green = new Color(0, 204, 0);
    Runnable futRun = new Runnable() 
        public void run() 
            EmbedBuilder futuresBot = new EmbedBuilder();
            futuresBot.setAuthor("Futures Bot", null, event.getAuthor().getAvatarUrl());

            try 
                futuresBot.addField("**S&P 500**", getSPY(), false);
                futuresBot.addField("**NASDAQ**", getNASDAQ(), false);
                futuresBot.addField("**DOW**", getDOW(), false);
                if (getSPY().contains("+")) 
                    futuresBot.setColor(green);
                
                else 
                    futuresBot.setColor(red);
                
            
            catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            


            futuresBot.setFooter("Cantina Capital", event.getGuild().getIconUrl());
            event.getChannel().sendMessage(futuresBot.build()).queue();

        

    ;

    if (scheduledFuture == null)
        scheduledFuture = exec.scheduleAtFixedRate(futRun, 0, 1, TimeUnit.HOURS);



if (args[0].equalsIgnoreCase("!futuresoff")) 
    event.getChannel().sendMessage("Futures bot off.").queue();
    if (scheduledFuture != null) 
        scheduledFuture.cancel(true);
        scheduledFuture = null;
    

    ```

【讨论】:

以上是关于关闭 ScheduledExecutorService的主要内容,如果未能解决你的问题,请参考以下文章

debian关闭log

关闭套接字会关闭流吗?

WINFORM如何关闭主窗口?

流的关闭

如果流没有手动关闭,它啥时候关闭?

在关闭连接之前关闭阅读器