Java 在等待其他任务完成时,在关机后执行服务并接受新任务

Java 在等待其他任务完成时,在关机后执行服务并接受新任务,java,android,multithreading,executorservice,Java,Android,Multithreading,Executorservice,请为android应用程序推荐一个解决方案,用户可以通过点击按钮请求执行任务 *这里的任务是非ui活动 我需要允许用户执行多个请求 在多任务执行期间,任务执行者应等待完成所有任务 当多个任务中的任何任务完成且任务执行者正在等待其他任务完成时,如果用户请求其他任务 任务,所以我应该被接受和执行 这个任务应该发生在android服务中,所以在应用程序退出时它不应该终止 我的表现: 我正在使用ExcutorService执行任务& ExecutorCompletionService它抛出错误,因

请为android应用程序推荐一个解决方案,用户可以通过点击按钮请求执行任务

*这里的任务是非ui活动


  • 我需要允许用户执行多个请求
  • 在多任务执行期间,任务执行者应等待完成所有任务
  • 当多个任务中的任何任务完成且任务执行者正在等待其他任务完成时,如果用户请求其他任务 任务,所以我应该被接受和执行
  • 这个任务应该发生在android服务中,所以在应用程序退出时它不应该终止
我的表现:

  • 我正在使用ExcutorService执行任务& ExecutorCompletionService它抛出错误,因为任务执行器为 等待其他任务完成,然后如果用户请求其他任务
java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.ExecutionCompletionService$QueueingFuture@4198abe8已从java.util.concurrent中拒绝。ThreadPoolExecutor@41caf8f8[正在关闭,池大小=1,活动线程=1,排队任务=0,已完成任务=1]

public int onStartCommand(Intent intent, int flags, int startId) {
        if (mIsAlreadyRunning) {
            MyTask task = new MyTask(++count, intent);
            mEcs.submit(task);
        }
        return super.onStartCommand(intent, flags, startId);
    }

protected void onHandleIntent(Intent intent) {
        if (mIsAlreadyRunning) {
            return;
        }
        mIsAlreadyRunning = true;
        final Collection<MyTask> tasks = mTasks;

        MyTask yt1 = new MyTask(count, intent);
        tasks.add(yt1);

        // wait for finish
        for (MyTask t : tasks) {
             mEcs.submit(t);
        }

        int n = tasks.size();
        for (int i = 0; i < n; ++i) {
            NoResultType r;
            try {
                r = mEcs.take().get();

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }

        mExec.shutdown();

        try {
            mExec.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

    }
public int-onstart命令(Intent-Intent、int-flags、int-startId){
如果(错误运行){
MyTask任务=新的MyTask(++计数,意图);
mEcs.提交(任务);
}
返回super.onStartCommand(intent、flags、startId);
}
受保护的手部内容无效(意图){
如果(错误运行){
返回;
}
mIsAlreadyRunning=true;
最终收集任务=MTASK;
MyTask yt1=新的MyTask(计数、意图);
任务。添加(yt1);
//等待完成
对于(MyTask t:任务){
mEcs.提交(t);
}
int n=tasks.size();
对于(int i=0;i

谢谢。

您没有正确使用IntentService。它给出错误是因为您正在提交另一个任务,而执行器调用了shutdown()

IntentService的文档:

所有请求都在单个工作线程上处理——它们可以作为 只要有必要(并且不会阻塞应用程序的主循环), 但一次只处理一个请求

关于IntentService的onStartCommand():

您不应该为您的IntentService重写此方法


您应该重新构造所有内容并使用常规服务,在onStartCommand()中提交任务,并在onDestroy()中调用exec.shutdown()。

我需要允许用户同时执行多个请求(任务),因此我想此解决方案无法满足此目的。请建议。常规服务将允许同时发出多个请求。您可以在onStartCommand()中将请求提交给执行者。IntentService是一种错误的方式,它适用于串行请求。谢谢。这适用于多个任务,但服务不会停止。它的“继续运行”和“销毁”并不像您建议的那样被称为“执行”。它应该在完成一项任务后关闭。我需要在电视上播放一些东西。请提出建议。如果服务继续运行会有什么危害?任务一直运行到完成,它什么也不做,等待下一个任务,直到被系统破坏。我确信有一种方法可以将它装配到stopself()服务中,但为什么呢?Android会在需要的时候清理它。