如何使用Java 5 Executor框架创建线程池

Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离。 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概念。 对于那些不熟悉Java中的线程池或这里的线程池的概念的人来说,Java中的线程池是工作线程的池,可以执行提供给他们的任何任务,主要是通过Runnable的实现形式或Callable接口。 由于Java支持编程语言本身中的多线程,因此它允许多个线程同时运行并执行任务的并行处理。 在本文中,我们将学习有关Java线程池的以下内容:

  1. Java中的线程池是什么?
  2. 为什么我们需要Java中的线程池?
  3. Java 5中的Executor框架是什么?
  4. 如何使用Java中的Executor框架创建固定大小的线程池?
  5. 在Java中使用线程池的好处?

什么是Java中的线程池以及我们为什么需要它

JavaSparrow-med
正如我所说的,线程池是已经创建好的工作线程池,准备好执行此工作。 线程池是任何多线程服务器端Java应用程序都需要的基本功能之一。 使用线程池的一个示例是创建一个处理客户端请求的Web服务器。 如果您熟悉套接字编程,那么您将知道ServerSocket.accept()正在阻塞方法并一直阻塞 ,直到建立套接字连接为止。 如果仅使用一个线程来处理客户端请求,则它将随后限制可以同时访问服务器的客户端数量。 为了支持大量客户端,您可以决定每个请求范例使用一个线程,其中每个请求由单独的线程处理,但这要求在请求到达时创建线程。 由于创建线程是耗时的过程,因此会延迟请求处理。 它还根据每个JVM允许的线程数限制客户端的数量,这显然是有限的。 线程池为您解决了这个问题,它创建了线程并对其进行管理。 线程池不是以创建线程并在完成任务后将其丢弃的方式,而是以工作线程的形式重用线程。 由于通常在应用程序启动时创建并池化线程,因此您的服务器可以立即开始请求处理,这可以进一步缩短服务器的响应时间。 除此之外,在Java应用程序中使用线程池还有其他好处,我们将在下一部分中看到。 简而言之,我们需要线程池来更好地管理线程并将任务提交与执行分离。 Java 5中引入的线程池和Executor框架是库提供的出色线程池。

Java线程池– Java 5中的执行器框架

Java 5引入了一些有用的功能(例如Enum , 泛型 , 变量参数)以及多个并发集合和实用程序(例如ConcurrentHashMap和BlockingQueue等),还引入了完整功能的内置线程池框架(通常称为Executor框架) 。 该线程池框架的核心是Executor接口,该接口使用方法execute(Runnable task)定义任务执行的抽象; ExecutorService扩展了Executor以添加各种生命周期和线程池管理功能,例如关闭线程池。 Executor框架还提供了一个称为Executors的静态实用程序类 (类似于Collections), 该类提供了几种静态工厂方法来创建Java中各种类型的线程池实现,例如固定大小的线程池,缓存的线程池和计划的线程池。

Runnable和Callable接口用于表示由这些线程池中管理的工作线程执行的任务。 Executor框架的有趣之处在于,它基于Producer使用者设计模式 ,其中应用程序线程产生任务和worker线程使用者或执行那些任务,因此,它也遭受了Producer使用者任务的限制,例如生产速度大大高于消耗。当然,仅当您的队列不受限制时,您才可能因为排队的任务而运行OutOfMemory。

如何使用Java中的Executor框架创建固定大小的线程池?

由于Executors类提供了静态工厂方法,因此使用Java 5 Executor框架创建固定大小的线程池非常容易。 您需要做的就是定义要同时执行的任务,然后将该任务提交给ExecutorService。 通过它们,线程池将负责如何执行该任务,它可以由任何空闲的工作线程执行,并且如果您对结果感兴趣,则可以查询Submit()方法返回的Future对象。 Executor框架还提供了不同类型的线程池,例如SingleThreadExecutor仅创建一个工作线程,或者CachedThreadPool在需要时创建工作线程。 您也可以查看Executor框架的Java文档以获取此API提供的服务的完整详细信息。 实践中的Java并发性还有两章专门介绍Java 5 Executor框架的有效使用,这对任何高级Java开发人员都值得一读。

Java中的线程池示例

这是Java中的线程池的示例,该示例使用Java 5的Executor框架创建工作线程数为10的固定线程池。它将创建任务并将其提交到线程池以执行:

public class ThreadPoolExample {public static void main(String args[]) {ExecutorService service = Executors.newFixedThreadPool(10);for (int i =0; i<100; i++){service.submit(new Task(i));}}}final class Task implements Runnable{private int taskId;public Task(int id){this.taskId = id;}@Overridepublic void run() {System.out.println("Task ID : " + this.taskId +" performed by " + Thread.currentThread().getName());}}Output:
Task ID : 0 performed by pool-1-thread-1
Task ID : 3 performed by pool-1-thread-4
Task ID : 2 performed by pool-1-thread-3
Task ID : 1 performed by pool-1-thread-2
Task ID : 5 performed by pool-1-thread-6
Task ID : 4 performed by pool-1-thread-5

如果查看此Java示例的输出,则会发现线程池中正在执行任务的线程不同。

Java线程池的好处

线程池为Java应用程序提供了几项好处,其中最大的好处是将任务提交与任务执行分离开来,如果紧密耦合的创建和执行模式比紧密耦合的创建和执行模式更为松散,则可以实现。 这是在Java中使用线程池的更多好处:

  1. 线程池的使用通过避免在请求或任务处理期间创建线程来减少响应时间。
  2. 使用线程池可让您根据需要更改执行策略。 您只需替换ExecutorService实现即可从单线程切换到多线程。
  3. Java应用程序中的线程池通过创建基于系统负载和可用资源决定的配置数量的线程来提高系统的稳定性。
  4. 线程池使应用程序开发人员摆脱了线程管理的束缚,并专注于业务逻辑。

以上就是Java 5中的线程池。我们已经了解了Java中的线程池,Java 5中的执行者框架,如何在Java中创建线程池以及在Java应用程序中使用线程池的一些好处。 毫无疑问,线程池的知识对于服务器端核心Java开发人员至关重要,我建议阅读Java中的Java线程和并发实践以了解有关并发和线程池的更多信息。

本文推荐书籍

  • Brian Goeatz,Doug Leaa,Joshua Bloch和团队的实践中的Java并发
  • Java线程,作者:Scott Oaks和Henry Wong
  • Joshua Bloach撰写的有效Java

参考: 如何使用Java 5 Executor框架创建线程池 -Javarevisited博客上JCG合作伙伴 Javin Paul的示例教程 。

翻译自: https://www.javacodegeeks.com/2013/07/how-to-create-thread-pools-using-java-5-executor-framework.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fedora python3-mysql_fedora 安装python mysql

如果你服务器环境允许yum&#xff0c;安装MySQL-python模块就很简单了。如果直接安装不行&#xff0c;先安装MySQL-devel后正常运行yum install mysql-develyum install MySQL-python -y1yum install MySQL–python–y当然也可以源码安装该模块首先安装 setuptools&#xff0c;…

var let 区别

var a 5; var b 10;if (a 5) {let a 4; // if 块级作用域var b 1; // 函数级作用域console.log(a); // 4console.log(b); // 1 } console.log(a); // 5 console.log(b); // 1var声明的变量是函数级的或者是全局的&#xff0c;而let用于声明块级作用域。 在函数或程序顶层…

服务器如何返回429状态,Instagram远程服务器返回一个错误:(429)UNKNOWN STATUS CODE...

我正在使用我自己的instagram api开发一些新程序。 一切都与我工作正常&#xff0c;除了以下的用户脚本 我想按照我的用户ID 的名单&#xff0c;所以我用这个代码Instagram远程服务器返回一个错误&#xff1a;(429)UNKNOWN STATUS CODEforeach (var item in listBox1.Items){We…

使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

在上一篇文章中 &#xff0c;我写了NetBeans 7.4 beta中提供的提示 &#xff0c;这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中&#xff0c;我将研究如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更加正确和清晰…

yum 和 rpm安装mysql彻底删除

1、yum方式安装的MySQL $ yum remove mysql mysql-server mysql-libs compat-mysql51 $ rm -rf /var/lib/mysq $ rm /etc/my.cnf 查看是否还有mysql软件&#xff1a; $ rpm -qa|grep mysql 如果存在的话&#xff0c;继续删除即可&#xff0c;删除方式&#xff1a;yum remove 【…

Web 开发中 Blob 与 FileAPI 使用简述

本文节选自 Awesome CheatSheet/DOM CheatSheet&#xff0c;主要是对 DOM 操作中常见的 Blob、File API 相关概念进行简要描述。 Web 开发中 Blob 与 FileAPI 使用简述 Blob 是 JavaScript 中的对象&#xff0c;表示不可变的类文件对象&#xff0c;里面可以存储大量的二进制编…

django1.5 连接mysql_django1.5.5使用mysql

pythn3.3下实现django1.5.5连接mysqldjango1.5.5发布有一段时间了&#xff0c;最大的亮点在于支持python3.在版本上跟进了python3的各种应用。而在数据库方面&#xff0c;django1.5.5的mysqldb却还停止不前。幸在有mysql自发布的connector python连接器对python3的支持。准备工…

Thread部分总结以及小例子

Thread总结&#xff1a;一直以来用thread比较多&#xff0c;一般会在同步以及ui中用到&#xff0e;以下对于经常用作为简单介绍&#xff0e;一 实现方法&#xff1a; 一种直接new thread&#xff0c;另外一种是实现Runnable接口&#xff0c;在创建thread的时候将Runnable直接丢…

服务器e系列和l的区别,i.e.和 e.g.的区别和使用方法

举例说明在很多文章中都有使用过&#xff0c;我想这个对大家应该并不陌生&#xff0c;但是大家知道ie和eg的区别吗&#xff0c;他们两个都是举例子的缩写词&#xff0c;但是他们之间的区别大家知道吗&#xff0c;今天我们就来介绍下这两个举例说明的缩写词到底有什么不一样。一…

django QuerySet对象转换成字典对象

今天做一个添加购物车的模块&#xff0c;在添加商品之前要先验证用户是否处于登录状态&#xff0c;前台用ajax异步发送请求&#xff0c;后台在接收到请求后从session中取出用户登录信息。 根据登录信息从用户表中查询出对应用户&#xff0c;再将状态码和用户信息返回到前台&…

通过基于JDBC的用户存储部署Identity Server

在这篇文章中&#xff0c;我将演示如何使用JDBC用户存储配置WSO2 Identity Server。 为了演示&#xff0c;我使用的是MySQL用户存储&#xff0c;但是相同的过程也适用于任何其他JDBC用户存储。 我的环境是 操作系统– Ubuntu 12.10 Java – 1.6 WSO2是4.5.0 设置MySQL数据库…

前端路由实现原理(history)

前端路由实现&#xff08;history&#xff09; 了解&#xff1a; HTML5 history新增了两个API:history.pushState和history.replaceState 两个api都接受三个参数 状态对象&#xff08;state object&#xff09;&#xff1a;一个JavaScript对象&#xff0c;与用pushState()方法…

mysql中临时表的特点_解析Mysql临时表及特点

临时表是当连接没有断开时存在&#xff0c;一旦断开就不会存在&#xff0c;临时表的数据和结构都在内存中&#xff0c;可以做个测验&#xff0c;你创建一个临时表&#xff0c;但是到响应的数据目录下并不会找到.frm文件mysql> CREATE TEMPORARY TABLE tmp_table (->->…

原生js实现一个连连看小游戏(三)-----------点击列表获取索引

需求&#xff1a;当点击一个列表时&#xff0c;我们要知道它在列表的第几项&#xff0c;即索引&#xff0c;代码实现如下&#xff1a; <!DOCTYPE html> <html> <head><title></title> </head> <body><ul id"myUl">&…

3、数组和集合

数组 ------------------------------------------------------------------ 一维数组 object Demo2 {def main(args: Array[String]): Unit {//定义数组&#xff0c;并指定长度val arr1 new Array[Int](5)arr1(0) 1arr1(2) 4printarr(arr1)//初始化并赋值val arr2 Array[…

unity 删除服务器项目,在吗?有个支持批量构建项目的好东西推荐给你

Unity Build Server是一种全新的项目构建辅助工具&#xff0c;它可以指定硬件设备&#xff0c;专门用于构建项目版本&#xff0c;帮助工作室大规模构建项目&#xff0c;提高团队生产力。很多人在选择Unity时并不会首先考虑到项目构建问题&#xff0c;而随着项目变得更大、更复杂…

使用WSO2 ESB构建制造服务总线(MSB)

在开始讨论本主题之前&#xff0c;我想介绍一些制造业中常用的术语。 术语制造执行系统&#xff08;MES&#xff09;由AMR Research于1990年提出&#xff0c;从先进的制造计算机信息系统的发展&#xff0c;MES概念已经发展了近三十年。 以下是制造执行系统协会&#xff08;MES…

mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法

案例分析&#xff1a;selectc.*fromhotel_info_original cleft joinhotel_info_collection honc.hotel_typeh.hotel_typeandc.hotel_idh.hotel_idwhereh.hotel_idis null这个sql是用来查询出 c 表中有 h 表中无的记录&#xff0c;所以想到了用 left join 的特性(返回左边全部记…

手把手教你写一份优质的前端技术简历

不知不觉一年一度的秋招又来了&#xff0c;你收获了哪些大厂的面试邀约&#xff0c;又拿了多少offer呢&#xff1f;你身边是不是有挺多人技术比你差&#xff0c;但是却拿到了很多大厂的offer呢&#xff1f;其实&#xff0c;要想面试拿offer&#xff0c;首先要过得了简历那一关。…

地兵布阵 -----------HDU-1166

C国的死对头A国这段时间正在进行军事演习&#xff0c;所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段&#xff0c;所以每个工兵营地的人数C国都掌握的一…