首页 文章

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

提问于
浏览
7

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

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

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

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

我主要是为了:

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

2 回答

  • 3

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

    ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setDaemon(true);
            return t;
        }
    });
    
  • 9

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

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

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

    这是一个0的corePoolSize,这意味着最少数量的0个工作线程保持活动状态,因此没有 . 当TPE(a.k.a ExecutorService)执行任务时,它会创建一个工作线程并将其添加到池中 . 现在,当在60秒的超时期间没有新任务进入时,(仍然保持活动的)工作线程终止并从池(缓存)中移除 .

    对我而言,这意味着不会发生内存泄漏,即使在ExecutorService上从未调用shutdown(),因为所有工作线程都存在,超时并且在没有新任务进入时将从池中删除超时期限 . 我想那样,就不会有任何对工作线程的引用留在池中,因此GC可以清理TPE实例 .

    如果我错了,请随意纠正我 .

相关问题