当前位置: 首页 > 面试题库 >

Java中的Executor和ExecutorCompletionservice之间的区别

朱运诚
2023-03-14
问题内容

正如问题标题本身所言,Java中的Executors和ExecutorCompletionService类之间有什么区别?

我是Threading的新手,所以如果有人可以用一段代码进行解释,那将会很有帮助。


问题答案:

假设您有一组任务,A, B, C, D, E并且要在中异步执行每个任务,并在Executor完成时按1逐个处理结果。

使用Executor,您将像这样:

List<Future<?>> futures = new ArrayList<Future<?>>();
futures.add(executorService.submit(A));
futures.add(executorService.submit(B));
futures.add(executorService.submit(C));
futures.add(executorService.submit(D));
futures.add(executorService.submit(E));

//This loop must process the tasks in the order they were submitted: A, B, C, D, E
for (Future<?> future:futures) {
    ? result = future.get();
    // Some processing here
}

这种方法的问题是不能保证任务A将首先完成。因此,当主线程A可能正在处理另一个任务(例如task
B)的结果时,它有可能阻塞空闲地等待任务完成。使用可以减少结果处理的等待时间ExecutorCompletionService

List<Future<?>> futures = new ArrayList<Future<?>>();
futures.add(executorCompletionService.submit(A));
futures.add(executorCompletionService.submit(B));
futures.add(executorCompletionService.submit(C));
futures.add(executorCompletionService.submit(D));
futures.add(executorCompletionService.submit(E));

//This for loop will process the tasks in the order they are completed,  
//regardless of submission order
for (int i=0; i<futures.size(); i++) {
    ? result = executorCompletionService.take().get();
    // Some processing here
}

因此,从本质上讲,ExecutorCompletionService当处理任务结果的顺序无关紧要时,可以用于提高效率。

需要注意的重要一件事。ExecutorCompletionService的实现包含一个结果队列。如果不调用takepoll耗尽该队列,将发生内存泄漏。某些人使用Futurereturn
by submit处理结果,这不是正确的用法。



 类似资料:
  • 本文向大家介绍Java中的Executor和ExecutorServices之间的区别,包括了Java中的Executor和ExecutorServices之间的区别的使用技巧和注意事项,需要的朋友参考一下 Executor和ExecutorServices这两个接口都是Executor框架的一部分。它随Java 5一起发布。  在Java中,线程创建是非常昂贵的操作,因此我们应该重用可用线程,而

  • 问题内容: 我知道已经解决了这个问题,但是我在SO上看到了不一致的论点。 所以,如果我有: 我得到 FALSE 。 据我了解,这是因为和是对同一对象()的两个不同引用。 所以我会有类似的东西: 现在,如果我只想比较两个字符串的 内容 ,我将使用 这是否意味着如果两个引用指向同一个对象,JVM就会简单地返回?因此,它不是在逐个字符地进行比较吗? 谢谢 编辑 拿着电话。感谢您指出优先顺序!!! 当我将

  • 问题内容: 在Java中,并作为收藏。但是我不知道在什么情况下应该使用什么时间。两者之间的主要区别是什么? 问题答案: 您正在专门询问ArrayList和HashMap,但我认为要完全了解发生了什么,您必须了解Collections框架。因此,ArrayList实现List接口,而HashMap实现Map接口。因此,真正的问题是您何时要使用列表以及何时要使用地图。这是Java API文档有很大帮助

  • 问题内容: 任何人都可以通过示例清楚地说明Java异常处理中throw与throws之间的区别吗?我曾尝试使用Google谷歌搜索,但无法得出结论。请帮助 问题答案: 子句用于声明异常,关键字用于显式引发异常。 如果我们明智地看待语法,则在其后是一个实例变量,然后是异常类名称。 在方法体内使用关键字来调用异常,在方法声明(签名)中使用子句。 例如 扔 抛出 您不能使用声明多个异常。您可以声明多个异

  • 问题内容: 我想知道将变量声明为和始终在Java块中访问变量之间的区别吗? 问题答案: 重要的是要了解线程安全有两个方面。 execution control, and memory visibility 第一个与控制代码何时执行(包括执行指令的顺序)以及是否可以同时执行有关,第二个与其他线程可以看到存储器中已完成操作的效果有关。由于每个CPU与主内存之间都具有多个高速缓存级别,因此运行在不同CP

  • 本文向大家介绍Java中的HashMap和HashSet之间的区别。,包括了Java中的HashMap和HashSet之间的区别。的使用技巧和注意事项,需要的朋友参考一下 HashMap和HashSet都是Java Collection框架最重要的类之一。 以下是HashMap和HashSet之间的重要区别。 序号 键 哈希映射 哈希集 1 实作 Hashmap是Map接口的实现。 另一方面,哈希