- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 CompletionService 类,我发现提交队列与完成队列的解耦非常有用。
但我也想念一种方法来轮询/接受已取消的任务(这在某种程度上可以被视为已完成)。可以通过某种方式轻松完成吗?
Future<String> task1Future = completionService.submit(myCallableTask1);
Future<String> task2Future = completionService.submit(myCallableTask2);
task2Future.cancel();
Future<String> lastComplTaskFuture = completionService.take();
//Seems to return only the completed or
//interrupted tasks, not those cancelled (task2)
编辑:检查了一些答案后,我意识到发生了什么。CompletitionService 以与提交的作业相同的顺序返回。如果您运行作业 a、b 和 c;在a工作时取消b和c;最后轮询completitionService,直到a任务结束才会通知b和c的取消。另外,我意识到如果你关闭执行器而不是取消单个任务,那些仍在队列中的任务不会到达 completionservice,即使它们的取消已经完成而 Activity 任务还没有结束。
EDIT2:好的,我添加了一个完整的测试用例
import java.util.concurrent.*;
public class CompletionTest {
public static void main(String[] args){
CompletionService<String> completion =
new ExecutorCompletionService<String>(Executors.newSingleThreadExecutor());
Future<String> aFuture =
completion.submit(() -> {Thread.sleep(10000); return "A";});
completion.submit(() -> {return "B";}).cancel(true);
completion.submit(() -> {return "C";}).cancel(true);
completion.submit(() -> {return "D";}).cancel(true);
long arbitraryTime = System.currentTimeMillis();
while (true){
String result = getNextResult(completion);
System.out.println(result);
if (System.currentTimeMillis() > arbitraryTime+5000){
aFuture.cancel(true);
}
}
}
public static String getNextResult(CompletionService<String> service){
try {
String taskId = service.take().get();
return "'"+taskId+"' job completed successfully.";
}
catch (InterruptedException e ) { return "Unknown job was interrupted/stopped while waiting (no thread.wait() or infinite loop in the job so I guess this should not be possible)."; }
catch (CancellationException e) { return "Unknown job was cancelled."; }
catch (ExecutionException e) {
return "Unknown job returned with the following internal exception while running: " + e.getCause().getMessage();
}
}
}
我期望这样的输出:
Unknown job was cancelled.
Unknown job was cancelled.
Unknown job was cancelled.
'A' job completed successfully.
但它是:
'A' job completed successfully.
Unknown job was cancelled.
Unknown job was cancelled.
Unknown job was cancelled.
我什至尝试使用 PriorityBlockingQueue 作为 CompletionService 的队列,使用 Comparator.<Future<String>,Boolean>comparing(Future::isCancelled).reversed()
但它也没有用(我想如果元素改变状态它不会求助)
最佳答案
您正在使用单线程将任务提交到线程池。
您提交的第一个任务将消耗该线程( hibernate 一小段时间)。
其他的将在 ExecutorService
中排队。取消相应的 future 不会从该队列中删除相应的任务。它只是改变了 Future
的状态。
任务将保留在队列中,直到有线程空闲来处理它们。线程会注意到相应的 Future
被取消并取消整个任务。那是 CompletionService
知道他们“完成”的时候,很快。
考虑增加线程池的大小。
关于java - 通过 CompletionService 查看取消的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34027370/
我需要配置重试策略以通过 ExecutorCompletionService 调用 API。 示例代码: public void func() throws Exception{ Execut
我尝试在 Java 上制作多线程程序,打印返回已完成线程的结果。问题是,当我运行此代码时,它只是卡在队列中的第二个值上: System.out.println("[!] Creaing
我有这样的东西: ExecutorService executor = Executors.newFixedThreadPool(2); CompletionService completionSer
所以,我对多线程还很陌生,并且最近在我的所有程序中都使用了这个想法。在我开始更多地使用它之前,我真的想确保它是使用 Executor、CompletionService 和 BlockingQueue
我需要做这样的事情: ExecutorService executor = Executors.newFixedThreadPool(2); CompletionService completionS
java.util.concurrent.CompletionService 是对 ExecutorService 的一个功能增强封装,优化了获取异步操作结果的接口。 假设我们要向线程池提交一批任务,
如果'使用 System.Linq;'存在并且 System.Linq 是引用的程序集之一,我希望 int[] 数组上的 Completions 返回 LINQ 扩展方法,例如Select<>(...
我对 Java 并发包非常陌生。我使用 java.util.concurrent.CompletionService 类从池中获取结果,而无需等待其他线程完成任务。但即使执行了 10 分钟的代码,我也
我正在研究 CompletionService 类,我发现提交队列与完成队列的解耦非常有用。 但我也想念一种方法来轮询/接受已取消的任务(这在某种程度上可以被视为已完成)。可以通过某种方式轻松完成吗?
我需要在多核机器上处理大量(>1亿)请求(每个请求是处理一个数据文件中的一行,涉及到一些与远程系统的I/O。虽然细节做没关系,具体任务是从一些数据文件中加载一个分布式的 Hazelcast map )
我有一个在 Tomcat 容器内运行的简单 Web 服务,它本质上是多线程的。在进入服务的每个请求中,我想对外部服务进行并发调用。 java.util.concurrent 中的 ExecutorCo
我有一个由多个线程访问的类,每个线程请求该类的一个方法。每个方法依次执行多个 Callables。该类使用ExecutorService中的threadPool通过invokeAll((Collect
我使用包裹在 2 线程 FixedThreadPool ExecutorService 周围的 CompletionService 提交了一些 Future 任务,然后我设置了一个等于提交任务数量的循
我想使用 CompletionService 来处理来自一系列线程的结果当它们完成时。我有一个循环中的服务来获取它提供的 Future 对象,但我不知道确定所有线程何时完成(并因此退出循环)的最佳方法
AbstractExecutorService public abstract class AbstractExecutorService implements ExecutorService
我刚刚在 this blog post 中找到了 CompletionService .但是,这并没有真正展示 CompletionService 相对于标准 ExecutorService 的优势。
我正在尝试提交多个任务并在可用时获取结果。但是,循环结束后,我必须强制所有任务在指定的时间内完成。如果没有,则抛出错误。最初,我所拥有的只是 executorService 的 invokeAll、s
可以安全地假设 java.util.concurrent.CompletionService.take().isDone() 总是返回true?如果是这样,为什么 take() 返回一个 Future
有很多关于如何等待所有“worker”作业完成的示例,但是如何在每个 worker 完成时以与 Java 的 CompletionService 相同的方式使用react呢? 我已经破解了一些有用的东
我们需要在一个线程中完成一些工作,该线程将在使用 Spring Boot 的 Web 应用程序的服务器上运行。 我们想要发生的是:1) 工作作为我们自定义的 Runnable 对象提交2)轮到工作时就
我是一名优秀的程序员,十分优秀!