多线程线程池的实现java_如何在Java中实现线程池

多线程线程池的实现java

线程是独立程序的执行路径。 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable。

多线程是指在一个任务中同时执行两个或多个线程。在多线程中,每个任务可以有多个线程,并且这些线程可以异步或同步地并行运行。 您可以在我在此处撰写的另一篇有关多线程的教程中找到有关线程和多线程的更多信息。

1.什么是线程池

线程池代表一组执行任务的工作线程,每个线程可以多次重用。 如果在所有线程都处于活动状态时提交了新任务,则它们将在队列中等待,直到某个线程可用为止。 线程池实现在内部使用LinkedBlockingQueue在队列中添加和删除任务。
我们通常想要的是一个工作队列,该队列与一组固定的工作线程组合在一起,该工作线程使用wait()notify()来向等待线程发出新工作到达的信号。 以下示例显示了一个简单的工作队列,该队列是Runnable对象的队列。 尽管没有特别要求Thread API使用Runnable接口,但这是调度程序和工作队列的通用约定。
package tutorials;import java.util.concurrent.LinkedBlockingQueue;public class ThreadPool {private final int nThreads;private final PoolWorker[] threads;private final LinkedBlockingQueue queue;public ThreadPool(int nThreads) {this.nThreads = nThreads;queue = new LinkedBlockingQueue();threads = new PoolWorker[nThreads];for (int i = 0; i < nThreads; i++) {threads[i] = new PoolWorker();threads[i].start();}}public void execute(Runnable task) {synchronized (queue) {queue.add(task);queue.notify();}}private class PoolWorker extends Thread {public void run() {Runnable task;while (true) {synchronized (queue) {while (queue.isEmpty()) {try {queue.wait();} catch (InterruptedException e) {System.out.println("An error occurred while queue is waiting: " + e.getMessage());}}task = queue.poll();}// If we don't catch RuntimeException,// the pool could leak threadstry {task.run();} catch (RuntimeException e) {System.out.println("Thread pool is interrupted due to an issue: " + e.getMessage());}}}}
}

在处理队列时使用同步块很重要,以控制线程对队列的访问。

package tutorials;public class Task implements Runnable {private int num;public Task(int n) {num = n;}public void run() {System.out.println("Task " + num + " is running.");}
}
import tutorials.Task;
import tutorials.ThreadPool;public class Main {public static void main(String[] args) {ThreadPool pool = new ThreadPool(7);for (int i = 0; i < 5; i++) {Task task = new Task(i);pool.execute(task);}
}

在上面的示例中,我们使用notify()而不是notifyAll() 。 因为notify()具有比notifyAll()更理想的性能特征; 特别是, notify()导致更少的上下文切换,这在服务器应用程序中很重要。 但是,使用时要确保重要notify()在其他情况下,因为与使用有关的微妙风险notify()它是唯一适当使用它在特定条件下。

下图演示了以上示例中的线程池设计。

图1。 线程池设计

2.有效使用线程池

线程池是一种用于构造多线程应用程序的强大机制,但并非没有风险。 使用线程池构建的应用程序可能具有与任何其他多线程应用程序相同的并发风险,例如死锁资源崩溃,同步或并发错误,线程泄漏和请求重载

这里有几点:

  • 不要将同步等待其他任务的任务排入队列,因为这会导致死锁。
  • 如果任务需要等待诸如I / O之类的资源,请指定最大等待时间,然后使任务执行失败或重新排队。 这保证了通过释放线程执行可能成功完成的另一任务将取得一些进展。
  • 有效地调整线程池的大小,并了解线程太少或线程太多都会导致问题。 线程池的最佳大小取决于可用处理器的数量以及工作队列上任务的性质。

3.结论

线程池对于组织服务器应用程序很有用,并且正确地实现它以防止任何问题(例如死锁和wait()notify()使用的复杂性)非常重要。 因此,建议考虑使用util.concurrent中的Executor类之一,例如ThreadPoolExecutor ,而不是从头开始编写线程池。 如果要求创建线程来处理短期任务,则可以考虑使用线程池。

4.下载源代码

这是线程池的教程,要下载源代码,请单击此处 。

翻译自: https://www.javacodegeeks.com/2016/12/implement-thread-pool-java.html

多线程线程池的实现java

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

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

相关文章

Windows 使用命令执行 sql 脚本文件

文章目录MySQL 数据库方法一&#xff1a;使用 mysql 命令方法二&#xff1a;使用 source 命令Oracle 数据库MySQL 数据库 方法一&#xff1a;使用 mysql 命令 未配置 MySQL 的环境变量&#xff0c;则需要进入 MySQL 的 bin 目录下才能执行 mysql 命令已配置 MySQL 的环境变量…

windows系统连接同局域网下的其他电脑mysql等服务

一、首先设置被连接的mysql服务的 root 用户及访问权限&#xff08;必须确保连接用户拥有不限ip访问权限&#xff09; 参考&#xff1a;https://blog.csdn.net/hkl_Forever/article/details/127543546 二、配置被连接电脑的防火墙、网络共享、设置出入端口规则等 1、打开防火墙…

js如何获取jwt信息_谈房地产公众号如何涨粉?一篇文章让你轻松获取信息

原标题&#xff1a;谈房地产公众号如何涨粉&#xff1f;一篇文章让你轻松获取信息对于房地产企业来说&#xff0c;如何学会运营自己企业的房地产微信公众号是涨粉引流的关键一步&#xff0c;老话说&#xff1a;一步走好&#xff0c;步步稳。值得夸奖的是近几年中高端房地产企业…

java开发plc上位机软件开发_上位机开发之西门子PLC-S7通信实践

写在前面&#xff1a;就目前而言&#xff0c;在中国的工控市场上&#xff0c;西门子仍然占了很大的份额&#xff0c;因此对于上位机开发而言&#xff0c;经常会存在需要与西门子PLC进行通信的情况。然后对于西门子PLC来说&#xff0c;通信方式有很多&#xff0c;下面简单列举一…

boss直聘账号异常登不上_【苹果IOS游戏账号分享】据说是最欢乐的2D冒险游戏?Q萌有趣,好不好玩你说了算——惊奇剑士...

惊奇剑士游戏下载点击下方卡片下载游戏&#xff01;不会使用请点击《操作指南》↓↓↓↓本游戏是由1群的资源库&#xff1a;“hentai是绅士不是变态” 赞助我们购买的&#xff0c;感谢大家的鼎力支持&#xff0c;二哈替大家感谢下hentai是绅士不是变态。可甜可盐的小哥哥之前还…

SQL语句执行顺序

文章目录SQL 简介SQL 语句的执行顺序重点SQL 简介 SQL 是 Structured Query Language 的缩写&#xff0c;称为结构化查询语言&#xff0c;SQL 是一种操作关系型数据库的规则&#xff0c;SQL 语句以分号结尾&#xff0c;不区分大小写&#xff0c;建议关键词使用大写。 SQL 语句…

getexternalfilesdir 相册_音乐相册(电子相册制作)V5.2 安卓最新版

音乐相册(电子相册制作)是一个功能强大的电子相册创建工具。最新版本的音乐专辑应用程序可以帮助用户快速创建精美的多媒体专辑视频&#xff0c;并匹配优美的音乐伴奏&#xff0c;使照片更精彩。音乐专辑应用程序支持几乎所有流行的图片格式&#xff0c;并支持导入和导出&#…

二级java题型及分值_2016年全国计算机二级java语言程序设计考试大纲

2016年全国计算机二级java语言程序设计考试大纲2016年3月计算机考试即将在3月26日-29日进行&#xff0c;为了帮助大家顺利通过2016年计算机二级考试&#xff0c;下面百分网小编为大家带来2016年全国计算机二级java语言程序设计考试大纲&#xff0c;供大家参考学习&#xff0c;预…

linux系统下安装jdk教程

一、首先下载linux版本jdk jdk官网&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 根据自己的需求&#xff0c;下载不同版本的jdk 2.将下载好的jdk压缩包&#xff0c;通过ftp上传到linux系统的当前用户下&#xff0c;我当前登录的用户为r…

iphone11什么时候上市_hd3手表高仿哪里买 什么时候上市?

hd3手表高仿哪里买 什么时候上市? 导读&#xff1a;hd3手表高仿哪里买zf的万国7日链高仿表怎么样&#xff1f;款式设计非常出色&#xff0c;很多手表的款式&#xff0c;依靠着该性价比的迅速提升来做出的有效转化&#xff0c;年轻人对于复刻表的选择&#xff0c;能拥有的这些细…

Windows 命令终端(CMD)程序员常用的命令

文章目录certutilcddirmd/mkdirrddelreplacechdir/cdattribhelptypemorefindstrrename/renset环境变量扩展echonetstattskilltasklisttaskkillnettreecopystartpauseprintverwinversysteminfowmiclogofftracertroute printtelnetftppingipconfigshutdown远程关机formatchkdskti…

驱动级的自动按键_空调遥控器特殊按键使用方法及注意事项

在上门维修过程中&#xff0c;用户常常由于遥控器使用不当&#xff0c;或者幵启了特定按键引起空调器的假性故障&#xff0c;这时需要进行电话解答或上门讲解&#xff0c;现对空调遥控器的特殊功能按键作简单介绍。示例遥控器型号为格力YAD0F,与KFR-23GW/ ( 23570 ) Aa-3挂式空…

净资产滚动率_净资产的结构

净资产滚动率Netty的包装结构很棒。 每个程序员都应该研究它。 每个系统都应该模仿它&#xff1b; 每个项目经理都应将其打印出来&#xff0c;拍在墙上&#xff0c;然后对开发人员说&#xff1a;“那样。” Netty是一个“ ...异步事件驱动的网络应用程序框架&#xff0c;用于…

Java从键盘输入若干数_用java编程序:从键盘输入若干个整数,输出这些数中大于其平均值的数。...

展开全部引用1楼 christal yhy的答案,考虑到浮点数的存在,特在此基础上优化一下,代码如下:public static void main(String[] args) {Scanner scan new Scanner(System.in);System.out.println("请输入62616964757a686964616fe59b9ee7ad9431333262373933要输入的个数:&qu…

java多线程编程_阿里P8熬到秃头肝出来的:Java多线程+并发编程核心笔记

自学Java的时候&#xff0c;多线程和并发这一块可以说是最难掌握的部分了&#xff0c;很多小伙伴表示需要一些易于学习和上手的资料。所以今天这本「Java并发学习手册.pdf」就是一份集中学习多线程和并发的手册&#xff0c;PDF版&#xff0c;由RedSpider社区的五位大神撰写&…

内外网逻辑隔离物理隔离_隔离域逻辑

内外网逻辑隔离物理隔离在一个设计模式课程中&#xff0c;我对建模域逻辑进行了有趣的讨论。 具体来说&#xff0c;它是关于隔离域逻辑的 。 一个应用程序通常分为三个部分&#xff1a; 演示&#xff08;例如桌面GUI&#xff0c;浏览器&#xff0c;Web服务&#xff09; 域逻辑…

360安全浏览器兼容模式怎么设置_测试新手一定要知道:最实用的Web兼容性测试经验都在这...

在日常工作中&#xff0c;我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试&#xff0c;目的在于保证待测试项目在不同的操作系统平台上正常运行。主要包括待测试项目能在同一操作系统平台的不同版本上正常运行&#xff1b;待测试项目能与相关的其他软件或系统的“和平…

HTML 中的节点、元素、标签、标记的区别

文章目录一、HTML 节点&#xff08;一&#xff09;节点的类型二、HTML 标签三、HTML 元素&#xff08;一&#xff09;HTML 元素属性&#xff08;二&#xff09;HTML 元素的嵌套一、HTML 节点 节点&#xff08;node&#xff09;是构成我们网页的最基本的组成部分&#xff0c;网…

cpu占用100_Java项目服务器cpu占用100%解决办法

1、使用命令top查看cpu进程&#xff0c;发现tomcat占用cpu使用率过高可以看到服务器负载很高&#xff0c;tomcat CPU使用已达到接近300%,内存20%。2、把进程的栈dump到文件里&#xff0c;以便后面的分析jstack 22764 > cpu0827.log 3、看看这个进程里面哪些线程在占用cputop…

apm java_非Java专家的APM:什么泄漏?

apm java通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用&#xff01; 内存&#xff0c;内存&#xff0c;内存... 内存是Java的关键部分&#xff0c;尤其是内存管理。 作为开发人员&#xff0c;内存管理不是您想…