gpt4 book ai didi

java - ExecutorService 并在关闭后等待其他任务完成时接受新任务

转载 作者:行者123 更新时间:2023-12-01 12:41:04 25 4
gpt4 key购买 nike

请为 Android 应用程序建议一个解决方案,用户可以通过单击按钮请求执行任务。

*这里的任务是非用户界面 Activity

  • 我需要允许用户执行多个请求
  • 在多个任务执行期间,任务执行器应等待完成所有任务。
  • 当多个任务中的任何任务完成并且任务执行器正在等待其他任务完成时,如果用户请求其他任务任务,所以我应该被接受并执行。
  • 此任务应在 Android 服务中发生,因此应用程序退出时不应终止。

我的表现如何:

  • 我正在使用 ExcutorService 执行任务&ExecutorCompletionService 它会抛出错误,因为任务执行器是等待其他任务完成,然后如果用户请求其他任务
java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.ExecutorCompletionService$QueueingFuture@4198abe8被java.util.concurrent.ThreadPoolExecutor@41caf8f8拒绝[正在关闭,池大小= 1, Activity 线程= 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();
}

}

谢谢。

最佳答案

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

IntentService 文档:

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.

关于 IntentService 的 onStartCommand():

You should not override this method for your IntentService.

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

关于java - ExecutorService 并在关闭后等待其他任务完成时接受新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25094912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com