java - 如何在Android应用程序中使用ExecutorService关闭

标签 java android multithreading executorservice

我正在编写一个 SDK,它具有带有 ExecutorService 的单例类。它看起来像这样:

public class MySingleton {
    private static MySingleton mInstance;
    private ExecutorService mExecutorService;

    private MySingleton() {
        mExecutorService = Executors.newSingleThreadExecutor();
    }

    // ...

    public void doSomething(Runnable runnable) {
        mExecutorService.execute(runnable);
    }
}

该 SDK 类旨在在整个应用程序中用于运行任务/Runnables,而 doSomething() 函数用于在单个线程中排队并运行所有 Runnables。

但我无法弄清楚的一件事是何时调用 ExecutorService.shutdown() 方法。如果我这样调用它:

public void doSomething(Runnable runnable) {
    if (mExecutorService.isTerminated()) {
        mExecutorService = Executors.newSingleThreadExecutor();
    }
    mExecutorService.execute(runnable);
    mExecutorService.shutdown();
}

这会违背使用一个线程的目的,因为如果第二次调用 doSomething() 时旧的 Runnable 仍在运行,则可能有两个不同的线程同时运行。当然,我可以有一个手动关闭ExecutorService的函数,但要求SDK的用户显式调用关闭函数似乎不太合适。

有人可以告诉我一些关于何时/如何在 Android 应用程序中调用 ExecutorService.shutdown() 的提示吗?谢谢

最佳答案

没有充分的理由在每次执行某些任务时调用 shutdown。当应用程序的某些部分正在关闭/完成时,您可能需要调用 shutdown。 IE。当服务停止时 - 那么如果它使用执行程序 - 那么我想你应该关闭它们 - 但实际上重点是允许所有任务在服务退出逻辑执行一些完成代码之前完成。 IE。通过使用:

  executors.shutdown();
  if (!executors.awaitTermination(5, TimeUnit.SECONDS)) {
    executors.shutdownNow();
  }

举个例子,这样的服务可以用来下载一些文件,用户会这样。想要暂停下载 - 即。通过打开相机应用程序(这可能会停止您的应用程序/服务以回收其资源/内存)。

关于java - 如何在Android应用程序中使用ExecutorService关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211251/

相关文章:

android - Cordova 应用程序因密集计算而阻塞

python - 加入守护线程

java - 我在 Java Swing 中遇到了一些粉碎事件问题

java - 每个请求是否访问同一个 servlet 对象?

java - 如何在 JNA 中向 java 数组添加偏移量

java - 我无法使用 FirebaseRecyclerAdapter 从 Firebase 数据库检索数据

java - 显示导入包的名称,但被划掉

java - 跳过 for 循环中的一次迭代

android - 警报对话框太小

Java ExecutorService - 任务/可调用不取消/中断