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

何时关闭android应用程序中的Executor服务

湛功
2023-03-14

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

根据您在Android应用程序中使用ExecutorService的经验,并考虑到应用程序状态的变化,如果我不想经常关闭并重新创建ExecutorService,请执行以下操作:

    executor = Executors.newCachedThreadPool();
    executor.submit(some Runnable);
    executor.shutdown();

,您会在何时何地重新关闭服务,然后恢复服务,以便我可以防止一些泄漏或一些无法预见的后果?

我主要是指:

1) 通过Backback中最后一个活动的back按钮关闭应用程序(应用程序使用许多活动)2)应用程序进入后台(在任何这些活动中)3)应用程序返回前台(在任何这些活动中)

共有3个答案

弘承运
2023-03-14

虽然这个问题已经发布多年了,但最近Android API 30已经不推荐AsyncTask,有人可能会被困在这里。要回答这个问题,没有必要关闭singleton ExecutorService,除非它有任何空闲线程。根据甲骨文文档:

程序中不再引用且没有剩余线程的池将自动关闭。如果要确保即使用户忘记调用shutdown(),也能回收未引用的池,则必须通过设置适当的保持活动时间,使用零核心线程的下限,安排未使用的线程最终消亡。。。

执行者。newCachedThreadPool()对于这种情况是一种很好的工厂方法。当应用程序进程终止时,它将自动关闭。

我的申请。爪哇:

public class MyApplication extends Application {
    private static ExecutorService executorService = Executors.newCachedThreadPool();
    ...
    public static Executor getExecutor() {
        return executorService;
    }
}

只需在代码中的任何地方使用MyApplication.getExecitor()

孟子墨
2023-03-14

我有一个ExecutorService的单例实例,它通过Dagger的对象图作用于Android应用程序实例。因此,实例的寿命与应用程序对象本身的寿命一样长。由于Android的应用程序类不提供onDestroy()回调,所以永远不知道何时应该在ExecutorService上调用shutdown()。

由于担心内存泄漏,我还研究了ThreadPoolExecutor并使用它来找出答案。这就是我发现的:遗嘱执行人。newCachedThreadPool()使用以下参数创建ThreadPoolExecutor:

ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>())

这是corePoolSize为0的值,这意味着至少有0个工作线程处于活动状态,因此没有工作线程。当TPE(也称为ExecutorService)执行任务时,它会创建一个工作线程并将其添加到池中。现在,当在60秒的超时期间没有新任务进入时,工作线程(仍保持活动状态)将终止并从池(缓存)中删除。

对我来说,这意味着不会出现内存泄漏,即使从未对ExecutorService调用shutdown(),因为所有存在的工作线程都会超时,并且在超时期间没有新任务进入时将从池中删除。我猜这样一来,池中就不会有对工作线程的任何引用,因此GC可以清理TPE实例

如果我错了,请随时纠正我。

南宫阳冰
2023-03-14

您可以做一种工作。将执行程序创建为守护程序。然后它将在您的应用程序退出时自动结束。您不必显式调用关闭

 ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() {
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
});
 类似资料:
  • 我正在开发一个应用程序,不断地从Kafka主题中读取数据。这些数据是字符串格式的,然后我将其写入xml文件 要编写这些文件,我使用执行服务。 我想知道什么时候应该关闭我的执行服务。如果我的应用程序是有时间限制的,我会在executor实例上使用它,但我的应用程序应该持续运行。 如果发生任何异常,我的整个应用程序被杀死,它会自动关闭我的执行者吗?或者我应该捕获一个未检查的异常并关闭我的执行器,就像我

  • 在我开发一个小型android应用程序的过程中,我遇到了一个问题,即使应用程序被用户终止,也无法运行警报管理器。当应用程序在前台或后台运行时,一切都很好。 我已经完成了follwing步骤: AndroidManifest.xml MainActivity.java在一个按钮的OnClick方法中,我称之为 x是类范围的vsisible变量 `public void startAlert(long

  • 我知道这个问题在网站上被问了很多,但是,我似乎找不到一个解决办法。当应用程序未运行时,不调用我的BOOT_COMPLETED接收器。 清单: 如果应用程序正在运行,并且我使用 事件被正确接收,但是,如果应用程序被关闭,事件不会被接收,也不会在启动时被接收。 我已经安装了应用程序,然后启动了它几次,以确保它已经注册。我对这件事很迷茫,所以任何建议都将非常感谢。

  • 我正在编写一个带有ExecutorService的单例类的SDK。它看起来像这样: 此SDK类用于在整个应用程序中运行任务/可运行程序,doSomething()函数用于在单个线程中排队并运行所有可运行程序。 但有一件事我搞不清楚,那就是什么时候给ExecutorService打电话。shutdown()方法。如果我这样称呼它: 它会破坏使用一个Thread的目的,因为如果在第二次调用doThin

  • 当我的应用程序启动时,将创建一个executor服务(在java.util.concurrent中使用Executors.NewFixedThreadPool(maxThreadNum))对象。当请求到来时,executor服务将创建线程来处理它们。 当应用程序启动时,它将在executorService池中创建200个线程。 只是想知道当应用程序启动时,这是一种正确的创建线程的方法吗?还是有更好