- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试同时使用 ExecutorCompletionService 和 ScheduledExecutorService。
我需要做的是安排不同的 Activity ,每个 Activity 都有“执行前的延迟”,然后根据上次运行的结果“重新安排它们”(不同的延迟)。”
我遇到的问题是我不能使用带有“延迟”的 ExcecutorCompletionService 提交
我尝试了以下方法,但它会永远阻塞...
显然,我遗漏了 Java 语言中的一个基本问题。
有没有办法将任务安排到 ScheduledExecutorService,以便 CompletionService“知道”?
public class Bar {
private ScheduledExecutorService scheduledExecutor;
private Future<Status> action1Future;
private Future<Status> action2Future;
private ExecutorCompletionService<Status> pool;
private long delay1 = 10;
private long delay2 = 20;
private long delay3 = 30;
public void start() {
scheduledExecutor = Executors.newScheduledThreadPool(3);
Action1 a1 = new ActionOne(); // Action1 implements Callable<Status>
Action2 a2 = new ActionTwo(); // Action2 implements Callable<Status>
pool = new ExecutorCompletionService<Status>(scheduledExecutor);
action1Future = scheduledExecutor.schedule(a1, delay1, TimeUnit.SECONDS);
action2Future = scheduledExecutor.schedule(a2, delay1, TimeUnit.SECONDS);
monitorAndRestart();
}
private void monitorAndRestart() {
boolean isDone=false;
do {
try {
// THIS IS WHERE IT BLOCKS.
Future<Status> processedItem = pool.get();
if (processedItem == action1Future) {
if (processedItem.get() == Status.GOOD) {
action1Future = scheduledExecutor.schedule(new ActionOne(), delay1, TimeUnit.SECONDS);
} else {
action1Future = scheduledExecutor.schedule(new ActionOne(), delay2, TimeUnit.SECONDS);
}
} else if (processedItem == action2Future) {
if (processedItem.get() == Status.GOOD) {
action1Future = scheduledExecutor.schedule(new ActionOne(), delay2, TimeUnit.SECONDS);
} else {
action1Future = scheduledExecutor.schedule(new ActionOne(), delay3, TimeUnit.SECONDS);
}
}
} catch (InterruptedException e) {
isDone = true;
// handle this.. shudown whatever
}
catch (ExecutionException e) {
// handle this
}
} while (isDone == false);
}
public static void main(String[] args) {
Bar myRunner = new Bar();
myRunner.start();
}
}
如果我把“delay in the Callable”通过 new ActionOne(delay) 创建可调用对象;并使用 CompletionService.submit(..) 它有效。
actionFuture1 = pool.submit(new ActionOne(delay1));
/////
public class ActionOne implements Callable<Status>(
private final delay;
public ActionOne(long dl) {
delay=dl;
}
Status call() {
try {
Thread.sleep(delay * 1000); // seconds
return doSomething()
} catch (...) { //thread.sleep execptions}
}
}
所以我想最后一个问题如下:ScheduledExecutorService 是否有比 Thread.sleep(delay) 方法更根本的东西?
最佳答案
我们在我们的一个应用程序中进行了这种重新安排,我们决定像 Ed Thomas 建议的那样包装任务。 (我们还通过传递一个返回任务下一次执行时间的迭代器,使重新调度变得非常灵活 - 允许我们使用许多不同的调度策略)。
另一种选择是继承 ScheduledThreadPoolExecutor 并覆盖 afterExecute。这最终可能比包装任务更干净。
关于java - 有没有办法将 ScheduledExecutorService 与 ExecutorCompletionService 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796960/
我想在 ExecutorCompletionService 上使用构造函数,它采用预定义的 BlockingQueue。 任何人都可以提供代码片段来展示这是如何完成的。似乎只需要一个带有 Future
我在程序完成时遇到 Java 的 ExecutorCompletionService 问题。 我需要使用 ExecutorCompletionService 而不是 ExecutorService 因
阅读JDK ExecutorCompletionService文档示例代码 /* * Suppose instead that you would like to use the first non
在我的应用程序中,ExecutorCompletionService 用于运行几个实现 Callable 的任务。当任务提交到 ExecutorCompletionServer 时,它会给出编译错误:
我有一个用 java 编写的应用程序,需要找到网络上所有可访问的主机。 我使用 InetAddress.isReachable() 来执行此操作,超时为 2000 毫秒。 我查找当前本地机器的 IP
我有一个场景 文本文件每天动态生成。 0 至每天 8 个。每个文件的大小可以从小到大。取决于当天的数据。 需要对其进行一些检查(业务检查、规则)。 我按照以下方式实现,它的行为不符合预期,似乎我做错了
我向 ExecutorCompletionService 提交了 5 个职位,但它似乎作业是按顺序执行的。传递给 ExecutorCompletionService 的构造函数的 ExecutorSe
我正在开发一个项目,其中有大量数据元素输入需要处理。每个的处理都是独立于其他的,我需要每个的返回结果。我现在正在做的是为每个元素创建一个 Callable 任务来进行处理,并使用 ExecutorCo
AbstractExecutorService public abstract class AbstractExecutorService implements ExecutorService
我有一个服务器应用程序监听 ServerSocket用于传入查询。提交查询的客户端希望打开到服务器的套接字,将其查询传递到上游,然后(可能在很短的时间之后)从他们使用的相同套接字读取对其查询的响应提交
我的 ExecutorCompletionService 出现了奇怪的行为。该项目被添加到 ExecutorCompletionService.submit() 中。然后它会被处理并由之前提交的 Ca
据我所知,执行器完成服务提供来自 future 对象的输出,无论任务在入站队列中请求的顺序如何,即无论哪个任务首先完成,结果都会放入出站队列中。另一方面,FixedThreadPool也是并行执行任务
我已经实现了一个基于的 PriorityExecutor http://funofprograming.blogspot.co.il/2013/11/priorityexecutorservice-f
我正在使用 ExecutorCompletionService 提交一些任务。我想等待最长的时间,比如说 5 秒,然后停止处理。 ExecutorService executorService = E
所以阅读 ExecutorCompletionService 的 javadoc ,看起来它使用了 threadpoolexecutor,它有像 invokeAll() 这样的方法,但是 Execut
我在使用 ExecutorCompletionService 时遇到了以下问题.我想在不同的线程中调用很多 Callable。这些 Callable 不会彼此共享任何信息。我需要为每个 Callabl
我正在尝试同时使用 ExecutorCompletionService 和 ScheduledExecutorService。 我需要做的是安排不同的 Activity ,每个 Activity 都有
我使用 Spring Boot 版本 2.1.9.RELEASE 和 Java 1.8,并且有两个 lang 运行进程,我想并行启动它们。因此我决定使用线程。 当我启动 sumResult 方法时,第
在我的应用程序中,我的任务已实现 Callable提交至ExecutorCompletionService并返回Future实例存储在List中。然后那些Future实例一一检索如下。
我一直在使用 ExecutorCompletionService 中的示例代码,并将以下示例代码放在一起。 solve() 中的代码按预期工作并打印 1 2 3 4 5 solve2() 中的代码不会
我是一名优秀的程序员,十分优秀!