Java 防止在重新启动ThreadPoolExecutor时使用它

Java 防止在重新启动ThreadPoolExecutor时使用它,java,android,multithreading,executorservice,Java,Android,Multithreading,Executorservice,在Android应用程序中,我有一个执行后台线程的ThreadPoolExecutor。大多数请求都是从UI线程调用的,例如: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); executor.execute(runnable); } 当用户从我的应用程序注销时会出现问题,在注销过程中,我关闭此执行器,然后再次创建它,以确保新用户登录时

在Android应用程序中,我有一个执行后台线程的ThreadPoolExecutor。大多数请求都是从UI线程调用的,例如:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    executor.execute(runnable);
}
当用户从我的应用程序注销时会出现问题,在注销过程中,我关闭此执行器,然后再次创建它,以确保新用户登录时没有任务运行

void logout(){
    executor.shutdownNow();
    ExecutorServiceUtils.waitForTermination(executor);
    executor = new ScheduledThreadPoolExecutor(THREAD_POOL_SIZE);
}
在某些情况下,当执行器“重新启动”时,UI会尝试执行executor.execute()。为了防止这种情况,我想阻止UI在执行器重新启动时执行任务。当然,我可以用任何java的屏障锁定UI线程,比如锁、同步、信号量,但是我不认为这是一个好方法(UI将被锁定)。 我也不能重构对执行器的所有调用,我需要使执行器线程安全


既然我假设这是一种常见的情况,那么有没有什么逻辑方法可以做到这一点,而我却没有做到?

你在等待新的,而不是旧的。您需要另一个变量。对不起,我在复制代码时出错了,实际上执行器在包装器中,所以我在这里简化了代码。是否应该先创建新的执行器并分配它,然后关闭旧的执行器?不知道为什么这些都被认为是必要的。例如,我不明白为什么你不关闭旧的执行器,在登录之前不启动新的执行器。有些任务甚至在登录之前就已经在执行了(例如,在后台查看短信)。但是你的解决方案是在旧的一个被关闭的同时拥有一个新的,听起来比我的想法简单得多。我要试试。经过测试,有效,简单干净的解决方案,如果你把它作为答案写下来,我会把它标记为正确的