当前位置: 首页 > 知识库问答 >
问题:

关闭Executor服务

於鸿羲
2023-03-14

我正在开发一个应用程序,不断地从Kafka主题中读取数据。这些数据是字符串格式的,然后我将其写入xml文件

要编写这些文件,我使用执行服务。

ExecutorService executor = Executors.newFixedThreadPool(4);
/*
 called multiple times in quick succession
*/
public void writeContent(String message) {
        try {
            executor.execute(new FileWriterTask(message));
        } catch(Exception e) {
            executor.shutdownNow();
            e.printStackTrace();
        }
    }

private class FileWriterTask implements Runnable{
        String data;

        FileWriterTask(String content){
            this.data = content;
        }

        @Override
        public void run() {
            try {
                String fileName = UUID.randomUUID().toString();
                File file = new File("custom path" + fileName + ".xml");
                FileUtils.writeStringToFile(file, data, Charset.forName("UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

我想知道什么时候应该关闭我的执行服务。如果我的应用程序是有时间限制的,我会在executor实例上使用它,但我的应用程序应该持续运行。

如果发生任何异常,我的整个应用程序被杀死,它会自动关闭我的执行者吗?或者我应该捕获一个未检查的异常并关闭我的执行器,就像我在上面的代码中所做的那样?我可以选择不在代码中显式关闭执行程序吗?我有什么选择?

编辑:因为我的类是@RestController类,所以我使用以下方法关闭了executor服务

@PreDestroy
    private void destroy() {
        executor.shutdownNow();
        if(executor != null) {
            System.out.println("executor.isShutdown() = " + executor.isShutdown());
            System.out.println("executor.isTerminated() = " + executor.isTerminated());
        }
    }

共有1个答案

金秦斩
2023-03-14

关闭Executor服务是一种很好的做法。有两种类型的关机需要注意:shutdown()和shutdownNow()。

如果在使用Java EE的应用服务器上运行应用程序,还可以使用ManagedExecutorService,它由框架管理,将自动关闭。

 类似资料:
  • 我有一个Java ExecutorService(固定线程池1),我将可运行的任务传递给它以供将来执行。每个任务通常在10秒内完成。Executor服务只是简单地完成任务。如果我关闭应用程序,我会运行以下程序:; 问题是它似乎需要一段时间才能关闭,有时可能需要几分钟,有时它似乎永远不会关闭,有时它会在几秒钟内关闭!在执行器队列中的任何时候都可能有大约2000个任务,但我只是希望它完成当前正在执行的

  • 假设我计划在整个应用程序中使用一个executorservice,向其发送新的runnable或callable以执行/提交,然后我命令立即关闭。我只想把我的“任务”交给executorservice,让他处理它们,并在提供资源的情况下执行它们(他有多少线程可用,如果需要,他可以创建多少线程,然后相应地将这些任务排队)。 根据您在Android应用程序中使用ExecutorService的经验,并

  • 这是我第一次尝试android服务,所以我有点迷茫。我正在开发一个应用程序,需要一个服务在后台运行的所有时间。此服务是从主活动中的onclick事件初始化的。要启动服务,我使用以下代码: 在服务中,我基本上有两件事。在onCreate方法中,我初始化一个计时器,每隔30分钟它就打开一个新线程,并检查服务器是否有任何新数据。在onStart方法上,我注册了一个接收器。 谢谢

  • 我刚开始学习Java多线程。我从这个简单的代码开始,但是似乎从未实现。 我希望“任务执行”结果应该被打印出来,但我得到了一个空控制台。 下面是我的简单类:

  • 我有一个后台服务,它初始化system.net.mqtt库,并等待来自mqtt的消息。我有一个ptoblem的OnHandleIntent inizize图书馆和关闭服务!!在开机启动时,又没有接收到消息,为什么??

  • 我已经尝试了一段时间试图关闭ChromeDriver服务,但我无法开发如何关闭的解决方案。我正在使用摩卡和柴进行单元测试。第一个测试通过,第二个由于错误而失败。 我试着在selenium webdrive/chrome中查找。js模块,无法找到关闭服务的函数。我试着搜索答案,但在网上也找不到任何答案。也许我创建chrome驱动程序的方法需要重新设计。我尝试使用“selenium webdriver