ExecutorService功能是Java 5附带的。它扩展了Executor接口,并提供了线程池功能来执行异步简短任务。

使用Java 6提供的ExecutorService接口有五种异步执行任务的方法。

ExecutorService execService = Executors.newCachedThreadPool();

这种方法的方法将创建一个线程池,该线程池会根据需要创建新线程,但是在可用之前会重用以前构造的线程。 这些池通常将提高执行许多短期异步任务的程序的性能。 如果没有可用的现有线程,则将创建一个新线程并将其添加到池中。 60秒钟未使用的线程将终止并从缓存中删除。

ExecutorService execService = Executors.newFixedThreadPool(10);

这种方法的方法创建了一个线程池,该线程池可重用固定数量的线程。 创建的nThreads将在运行时处于活动状态。 如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到某个线程可用为止。

ExecutorService execService = Executors.newSingleThreadExecutor();

这种方法的方法将创建一个执行器,该执行器使用在无限制队列上运行的单个工作线程。 确保任务按顺序执行,并且在任何给定时间都不会激活一项以上的任务。

ExecutorService的方法:

execute(Runnable):在将来的某个时间执行给定命令。

Submit(Runnable): Submit方法返回一个表示执行任务的Future对象。 如果任务正确完成,则Future Object返回null。

shutdown():启动有序关闭,在该关闭中执行先前提交的任务,但不接受任何新任务。 如果已关闭,则调用不会产生任何其他影响。

shutdownNow():尝试停止所有正在执行的任务,暂停正在等待的任务的处理,并返回正在等待执行的任务的列表。
除了尽最大努力尝试停止处理正在执行的任务之外,没有任何保证。 例如,典型的实现将通过Thread.interrupt取消,因此任何无法响应中断的任务都可能永远不会终止。

下面是一个示例应用程序:

步骤1:建立已完成的专案

创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件来创建它)。

第2步:创建新任务

通过实现如下所示的Runnable接口(创建线程)来创建新任务。 TestTask类指定将要执行的业务逻辑。

package com.otv.task;import org.apache.log4j.Logger;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestTask implements Runnable {private static Logger log = Logger.getLogger(TestTask.class);private String taskName;public TestTask(String taskName) {this.taskName = taskName;}public void run() {try {log.debug(this.taskName + " is sleeping...");Thread.sleep(3000);log.debug(this.taskName + " is running...");} catch (InterruptedException e) {e.printStackTrace();}}public String getTaskName() {return taskName;}public void setTaskName(String taskName) {this.taskName = taskName;}}

步骤3:使用newCachedThreadPool创建TestExecutorService

通过使用方法newCachedThreadPool创建TestExecutorService。 在这种情况下,将在运行时指定创建的线程数。

package com.otv;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.otv.task.TestTask;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestExecutorService {public static void main(String[] args) {ExecutorService execService = Executors.newCachedThreadPool();execService.execute(new TestTask("FirstTestTask"));execService.execute(new TestTask("SecondTestTask"));execService.execute(new TestTask("ThirdTestTask"));execService.shutdown();}
}

运行TestExecutorService时,输出将如下所示:

24.09.2011 17:30:47 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:30:47 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:30:47 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - ThirdTestTask is running...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - SecondTestTask is running...

步骤4:使用newFixedThreadPool创建TestExecutorService

通过使用方法newFixedThreadPool创建TestExecutorService。 在这种情况下,将在运行时指定创建的线程数。

package com.otv;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.otv.task.TestTask;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestExecutorService {public static void main(String[] args) {ExecutorService execService = Executors.newFixedThreadPool(2);execService.execute(new TestTask("FirstTestTask"));execService.execute(new TestTask("SecondTestTask"));execService.execute(new TestTask("ThirdTestTask"));execService.shutdown();}
}

运行TestExecutorService时,在完成FirstTestTask和SecondTestTask的执行之后,将执行ThirdTestTask。 输出将被视为
下面:

24.09.2011 17:33:38 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:33:38 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:33:41 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:33:41 DEBUG (TestTask.java:23) - SecondTestTask is running...
24.09.2011 17:33:41 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:33:44 DEBUG (TestTask.java:23) - ThirdTestTask is running...

步骤5:使用newSingleThreadExecutor创建TestExecutorService

通过使用方法newSingleThreadExecutor创建TestExecutorService。 在这种情况下,仅创建一个线程,并按顺序执行任务。

package com.otv;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.otv.task.TestTask;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestExecutorService {public static void main(String[] args) {ExecutorService execService = Executors.newSingleThreadExecutor();execService.execute(new TestTask("FirstTestTask"));execService.execute(new TestTask("SecondTestTask"));execService.execute(new TestTask("ThirdTestTask"));execService.shutdown();}
}

当运行TestExecutorService时,FirstTestTask的执行完成后,将执行SecondTestTask和ThirdTestTask。 输出将如下所示:

24.09.2011 17:38:21 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:38:24 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:38:24 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:38:27 DEBUG (TestTask.java:23) - SecondTestTask is running...
24.09.2011 17:38:27 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:38:30 DEBUG (TestTask.java:23) - ThirdTestTask is running...

步骤6:参考资料

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html
http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

参考: Online Technology Vision博客中来自我们JCG合作伙伴 Eren Avsarogullari的Java Executor服务类型 。

翻译自: https://www.javacodegeeks.com/2012/08/java-executor-service-types.html

Java执行程序服务类型相关推荐

  1. 【Java核心面试宝典】Day16、“计算机网络协议层次及服务类型”面试题!✊✊✊

    Hello,你好呀,我是灰小猿!一个超会写bug的程序猿! 用坚持缔造技术.用指尖敲动未来! 和很多小伙伴们一样,我也是一名奔波在Java道路上的"创造者".也想靠技术来改未来,改 ...

  2. 《Java入门》计算油费:本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。

    现在90号汽油6.95元/升.93号汽油7.44元/升.97号汽油7.93元/升.为吸引顾客,某自动加油站推出了"自助服务"和"协助服务"两个服务等级,分别可得 ...

  3. JMS : Java Message Service (Java消息服务)之一 [转]

    为什么80%的码农都做不了架构师?>>>    1 引言 1.1 编写目的 本文作为B2bi项目中开源产品JORAM的使用指导文档,旨在帮助项目组人员方便明了的进行JMS模块的详细设 ...

  4. Java 微服务实践

    楔子 目前业界最流行的微服务架构正在或者已被各种规模的互联网公司广泛接受和认可,业已成为互联网开发人员必备技术.无论是互联网.云计算还是大数据,Java平台已成为全栈的生态体系,其重要性几乎不可替代. ...

  5. Java微服务学习笔记(一):微服务架构的概念理解

    Java微服务学习笔记 Tips:入门学习时粗略整理,仅供参考 (一):架构的基础理解 文章目录 Java微服务学习笔记 前言 一.微服务是什么? 二.常用开源微服务框架演化 1. Dubbo 2. ...

  6. Java微服务 vs Go微服务,究竟谁更强!?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 Java微服务能像Go微服务一样快吗?这是我最近一直 ...

  7. Java消息服务JMS详解

    2019独角兽企业重金招聘Python工程师标准>>> JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业 ...

  8. JAVA修饰符类型(public,protected,private,friendly)

    JAVA修饰符类型(public,protected,private,friendly) public的类.类属变量及方法,包内及包外的不论什么类均能够訪问: protected的类.类属变量及方法, ...

  9. JMS(Java消息服务)入门教程

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

最新文章

  1. php图片生成缩略图_PHP实现生成图片缩略图函数
  2. 解决Keepalived脚本启动时warning、Unsafe
  3. python-opencv时间计算,视频物体追踪标记
  4. 垃圾回收②---相关概念
  5. C++ 高级数据类型(二)—— 字符序列
  6. ImageView的scaleType详解
  7. [数据预处理] onehot编码:是什么,为什么,怎么样
  8. 严蔚敏版《数据结构 (C语言版)》和《数据结构题集》(五)——栈和队列...
  9. ASP和JS读写Cookie的问题
  10. java项目异常处理视频_异常的抛出和处理_JavaSE系列视频课程之异常处理(四)_Java视频-51CTO学院...
  11. 039 我的技术成长历程
  12. java程序员的项目经历如何写,大量教程
  13. 人脸识别-倍加信梯控控制
  14. php实现微信登录详细教程,PHP开发微信授权登录操作教程
  15. “手机到底是如何实现定位的?工作原理是什么?”
  16. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一2.15圆形构图
  17. 全国计算机等级考试Python二级知识点_1
  18. jieba分词词性标注含义
  19. 设n是一个任意自然数,如果n的各位数字反向排列所得的自然数与n相等,则n称为回文数。从键盘输入一个5位数字,请编写程序判断这个数字是不是回文数
  20. XOR World(异或运算)

热门文章

  1. 如何基于tomcat构建web站点
  2. thinking-in-java(20)注解
  3. 利用反射机制创建新类的两种方式及比较
  4. leetcode初级算法1.删除排序数组中的重复项
  5. java初学者指南_Java代理初学者指南
  6. plsql例外_大例外背后的真相
  7. jdbc mysql驱动_MySQL JDBC驱动程序如何处理准备好的语句
  8. jdbc事务 jta事务_将非事务性资源绑定到JTA事务中的几种模式
  9. jdk 8 集合对象排序_使用JDK 8流在包装对象的集合和包装对象的集合之间转换
  10. java 拼图_我最喜欢的Java拼图2 + 1 = 4