Java中ExecutorService和CompletionService区别

A-Level CS 计算机科学 考试知识点——考试介绍&第1章 前言:该系列文章是本人在给学生辅导本课程的过程中结合英文教材所总结的,该系列共分为30章,主要介绍了考试的核心知识点。若需要A-Level CS 计算机科学考试辅导也可以私信我。 目录 关于A-Level CS 计算机科学考试 考试简介 考试内容 考试时间 评分情况 第1章 信息表示 本章学习内容 1.01 数字系统 1.02 数字的内部编码 整数编码(Coding for integers) 二进制编码的十进制(Binary coded decimal——BCD) 1.03. 阅读详情

转自:http://www.th7.cn/Program/java/2011/11/09/46459.shtml

我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用。

之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象。

在主线程中遍历这个list并调用Future的get()方法取到Task的返回值。

 

但是,我在很多地方会看到一些代码通过CompletionService包装ExecutorService,然后调用其take()方法去取Future对象。以前没研究过这两者之间的区别。

今天看了源代码之后就明白了。

 

这两者最主要的区别在于submit的task不一定是按照加入自己维护的list顺序完成的。

从list中遍历的每个Future对象并不一定处于完成状态,这时调用get()方法就会被阻塞住,如果系统是设计成每个线程完成后就能根据其结果继续做后面的事,这样对于处于list后面的但是先完成的线程就会增加了额外的等待时间。

 

而CompletionService的实现是维护一个保存Future对象的BlockingQueue。只有当这个Future对象状态是结束的时候,才会加入到这个Queue中,take()方法其实就是Producer-Consumer中的Consumer。它会从Queue中取出Future对象,如果Queue是空的,就会阻塞在那里,直到有完成的Future对象加入到Queue中。

所以,先完成的必定先被取出。这样就减少了不必要的等待时间。

apm软件仿真+QGC地面站 环境搭建 本教程使用场景:apm软件仿真运行于虚拟机 ubuntu环境。qgc地面站位于windows 系统。两个环境在同一台电脑上。 一.apm仿真环境搭建 1.安装vm虚拟机及ubuntu 18。 2.ubuntu下 下载Ardupilot 飞控源码 并配置环境。 下载源码: git clone https://github.com/ArduPilot/ardupilot cd ardupilot git submodule update --init --recursive 配置所需运行的环境: 阅读详情

相关推荐

JavaExecutorService线程池的使用(RunnableCallable多线程实现)

线程的创建释放,需要占用不小的内存资源。如果每次需要使用线程时,都new 一个Thread的话,难免会造成资源的浪费,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。不利于扩展,比如如定时执行、定期执行、线程中断,所以很有必要了解下ExecutorService的使用。ExecutorServiceJava提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过ExecutorService获得线程。...

BADAO_LIUMANG_QIZHI的博客 8195

java 调用其他线程_java 后台接口另起一个线程执行其他业务

直接post代码,然后在详细介绍为什么:packagecom.xxx.testset.service.impl;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/**** @function xxx接口实现类*@authorLiangjw* @date 2019-9-18 下午02:...

weixin_39986060的博客 1209

VS2015 编译的 GSL 2.3

用 VS2015 编译的 GSL 2.3 。包括静态库 DLL。静态库 DLL又分别对应了 win32 x64 两种配置。 gsl 是 GNU Scientific Library,著名的数值计算库。

ExecutorService详解

前言         在我们的日常开发中,难免会使用到线程,部分还会用到多线程并发问题。我们知道,线程的创建释放,需要占用不小的内存资源。如果每次需要使用线程时,都new 一个Thread的话,难免会造成资源的浪费,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。不利于扩展,比如如定时执行、定期执行、线程中断,所以很有必要了解下ExecutorService的使用。 ...

文韬武略的专栏 8万+

Java线程池ExecutorService学习使用

线程池中有3个线程 (pool-1-thread-1、pool-1-thread-2 pool-1-thread-3),每个线程可以同时执行一个任务。如果需要每个任务执行之后需要返回一个结果,可以实现Callable接口并重写call方法。每个任务执行的过程包括打印任务开始的信息、模拟执行2秒、打印任务完成的信息。每个任务执行2秒,然后完成,接着线程池中的线程会继续执行等待中的任务。前3个任务会立即被分配给线程池中的3个线程并开始执行。使用一个固定大小为3的线程池来并发执行这些任务。

Dd_ddc的博客 3651

Java线程池 ExecutorService

一、ExecutorService介绍 ExecutorServiceJava中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了后台任务执行相关的方法: Java API对ExecutorService接口的实现有两个,所以这两个即是Java线程池具体实现类: ThreadPoolExecutor ScheduledThreadPoolExecutor ExecutorService还继承了Executor接口(注意区分Executor接口Execu

qq_40056060的博客 5833

javaexecutorservice_JavaExecutorServiceCompletionService区别

我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用。之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象。在主线程中遍历这个list并调用Future的get()方法取到Task的返回值。public class Com...

weixin_34901508的博客 232

[Java线程池]ExecutorService|CompletionService区别与选择

这段时间对业务系统做了个性能测试,其中使用了较多线程池的技术,故此做一个技术总结。 这次总结的内容比较多,主要是四个: ExecutorService CompletionService Runnable Callable 前两个是线程池相关接口,后两个是多线程相关接口。在最后,我会说明什么情况下使用哪个接口,这两类接口如何搭配使用。 Tips:个人拙见,如有不对,请多多指正。 一、ExecutorService ExecutorService是一个接口,继承自Executor。ExecutorSe

NBA首席形象大使坤坤 1565

秒懂 Java ExecutorService

Java java.util.concurrent 包的重要组成部分,是 Java JDK 提供的框架,用于简化异步模式下任务的执行。一般来说,ExecutorService 会自动提供一个线程池相关 API,用于为其分配任务。

二师兄撒欢之地 1867

java并发中ExecutorService的使用

文章目录创建ExecutorServiceExecutorService分配Tasks关闭ExecutorServiceFutureScheduledExecutorServiceExecutorService Fork/Join java并发中ExecutorService的使用 ExecutorServicejava中的一个异步执行的框架,通过使用ExecutorService可以方便的...

程序那些事 1万+

Java ExecutorService:你真的了解它吗?

Java ExecutorServiceJava并发编程中一个强大的工具,它提供了一种管理线程生命周期执行多个异步任务的方式。它是基于线程池的概念,能够有效地管理复用线程,从而提高程序的性能资源利用率。ExecutorService通过隐藏线程的创建管理细节,简化了多线程编程。它可以创建不同类型的线程池,如固定大小线程池、缓存线程池单线程线程池,以满足不同场景下的需求。任务提交后,ExecutorService负责调度执行这些任务,并管理它们的执行状态。

忆~遂愿的博客 6446

Java ExecutorService

ExecutorServiceJava并发编程中的一个接口,定义在 java.util.concurrent 包中。是 Java JDK 提供的框架,用于简化异步模式下任务的执行。

weixin_47363690的博客 1619

ExecutorService(任务调度器)详解

前言:这是一次艰苦的旅行... 一.ExecutorService: 它也是一个接口,它扩展自Executor接口,Executor接口更像一个抽象的命令模式,仅有一个方法:execute(runnable);Executor接口简单,但是很重要,重要在这种设计的模式上。。   ExecutorService在Executor的基础上增加了“service”特性的方法: shutd...

深入一点 1283
上一篇: IBM WebSphere MQ消息通道的配置和维护介绍(一)
下一篇: java并发编程-Executor框架
shoubuliaolebu
博客等级 码龄19年 4粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值