何时关闭android应用程序中的executorservice

Luc*_*cas 9 android executorservice

让我们假设我计划在我的整个应用程序中使用一个executorservice,我正在发送新的runnable或callable来执行/提交,并且我在执行此操作后立即拒绝关闭.我只想把我的"任务"扔给executorservice并让他处理它们并执行它们给它的资源(他有多少线程可用,如果需要他可以创建多少线程,然后相应地排队这些任务).

根据您在Android应用程序中使用ExecutorService的经验,并考虑应用程序状态更改,如果我不想通过执行以下操作来不断关闭并重新创建执行程序服务:

    executor = Executors.newCachedThreadPool();
    executor.submit(some Runnable);
    executor.shutdown();
Run Code Online (Sandbox Code Playgroud)

,你什么时间和地点建议关闭服务,然后恢复它,以便我可以防止一些泄漏或一些不可预见的后果?

我主要是为了:

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

Man*_*wam 10

你可以做一个工作.将执行程序创建为守护程序.然后它会在您的应用程序退出时自动结束.你不必明确地调用shutdown.

 ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() {
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
});
Run Code Online (Sandbox Code Playgroud)


Seb*_*gel 7

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

由于我害怕内存泄漏,我也在研究 ThreadPoolExecutor 并使用它来找出答案。这是我发现的: Executors.newCachedThreadPool() 使用以下参数创建一个 ThreadPoolExecutor:

ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>())
Run Code Online (Sandbox Code Playgroud)

那是 corePoolSize 为 0,这意味着最少有 0 个工作线程保持活动状态,所以没有。当 TPE(又名 ExecutorService)执行任务时,它会创建一个工作线程并将其添加到池中。现在,当在 60 秒的超时时间内没有新任务进入时,(仍然保持活动状态)工作线程将终止并从池(缓存)中删除。

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

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

  • 真棒发现。谢谢塞巴斯蒂安。我刚才做了一个小测试,确实它的行为与您指出的完全一样,并且正如 ThreadPoolExecutor 的文档中所写的那样。这似乎是第二种解决方案,如果不想将线程作为守护进程,则更可取。如果您将 ExecutorService 转换为 ThreadPoolExecutor,您还可以更改 KeepAlive 设置。所以最后,我认为你提出的案例没有任何问题,我会明确地尝试在我的下一个项目中使用它。 (2认同)