Java线程:我应该创建几个

介绍
“我应该创建多少个线程?”。 许多年前,我的一个朋友问我这个问题,然后我按照“ CPU核心数+ 1”的指示给了他答案。 当您在这里阅读时,大多数人都在点头。 不幸的是,我们所有人当时都错了。
现在,如果您的体系结构是基于共享资源模型的,那么我会给出答案,那么您的线程号应为“ CPU核心数量+ 1”,具有更好的吞吐量,但是如果您的体系结构是非共享模型(例如SEDA,ACTOR)那么您可以根据需要创建任意多个线程。  
走过
因此,出现了一个问题,为什么这么多的长老继续为我们提供“ CPU核心数+ 1”的准则,因为他们告诉我们线程的上下文切换很繁重,并且会阻碍您的系统可伸缩性。 但是noboday注意到他们所使用的编程或体系结构模型。 因此,如果您仔细阅读,会发现其中大多数描述了实用程序设计或体系结构模型是基于共享资源模型的。
给你几个例子:
1.套接字编程–套接字层被许多请求共享,因此您需要在每个请求之间进行上下文切换。
2.信息提供者系统–大多数客户将连续访问相同的请求
等等…
因此,它们将满足访问同一资源情况的多个请求,因此,由于其系统的一致性要求,系统将需要对该资源添加锁定。 锁争用将发挥作用,因此多线程的上下文关系将非常繁重。
在发现这一有趣的事情之后,我认为其他编程或体系结构模型可以绕过该限制。 因此,如果共享资源模型无法创建更多的Java线程,也许我们可以尝试不共享模型。
因此,幸运的是我有机会创建一个需要较大扩展性的系统,该系统需要以非常快的方式发出大量通知。 因此,我决定继续使用SEDA模型进行试验,并通过我的多通道commonj模式进行利用,当前,如果一台计算机上的Java堆设置为1.5 GB,那么我可以运行最大数量约为600个线程的Java应用程序。
那么,一个Java线程的平均内存消耗大约为512 KB(请参阅: http : //www.javacodegeeks.com/2011/04/erlang-vs-java-memory-architecture.html ),因此几乎有600个线程需要300M内存消耗(包括Java本机和Java堆)。 而且,如果您的系统设计良好,那么300M的使用量将不会增加您的负担。
顺便说一句,在Windows中您不能创建超过1000个线程,因为Windows无法很好地处理线程,但是如果您使用NPTL,则可以在Linux中创建1000个线程。 许多人告诉您,Java无法处理并非100%正确的大型并发作业处理。
有人可能会问线程本身的生命周期交换如何:就绪–可运行–运行–等待。 我想说Java和最新的操作系统已经可以有效地处理它们,如果您具有多核CPU并启用NUMA,则整个性能将得到进一步提高。 因此,至少从一开始就不是您的瓶颈。
当然,创建线程和使线程进入运行阶段是非常繁重的事情,因此请充分利用线程池(jdk:执行程序)
您可以参考: http : //community.jboss.org/people/andy.song/blog/2011/02/22/performance-compare-between-kilim-and-multilane-commj-pattern以了解许多Java线程的功能  
结论
将来您将如何回答“我应该创建多少个Java线程?”这个问题。 希望您的回答变为:
1.如果您的架构基于共享资源模型,则您的线程号应为“ CPU核心数+1”,并具有更好的吞吐量
2.如果您的架构是非共享模型(例如SEDA,ACTOR),那么您可以创建所需数量的线程。
参考: 应该创建多少个Java线程? 来自我们的JCG合作伙伴 Andy Song,其歌曲为andy's Stuff博客。

翻译自: https://www.javacodegeeks.com/2012/08/java-threads-how-many-should-i-create.html

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

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

相关文章

java ui自动化测试脚本,如何用Airtest编写UI自动化脚本(示例代码)

前言游戏并不像app一样直接把渲染树节点暴露出来,这就造成游戏UI自动化在元素定位上的不方便性,不过依赖airtest的图片识别,我们可以直接跳过元素检查,以图片对比的形式进行自动化,虽然效率可能会低一些,但…

Spring JDBC数据库连接池设置

对于任何Java应用程序而言, 在Spring框架中设置JDBC数据库连接池都是很容易的,仅需更改spring配置文件中的一些配置即可。使用Apache Commons DBCP和Commons Pool以及Spring框架的连接池是不错的选择,但是如果您拥有Web服务器和托管的J2EE容器…

BZOJ 3505 [Cqoi2014]数三角形(组合数学)

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id3505 【题目大意】 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。   注意三角形的三点不能共线。 【题解】 我们计算三个点组合的情况,去除横竖三共线,以及斜…

matlab多项式加法运算,matlab多项式运算与代数方程求解解析.ppt

* 多项式运算与代数方程求解 数学软件 Matlab Matlab基础及应用 * 多项式转化为符号表达式:poly2sym 四则运算:conv、deconv 导数与积分:ployder、polyint 求值与零点:polyval、polyvalm、roots、poly 多项式运算 主要内容 代数方…

java.lang.NoClassDefFoundError:如何解决–第3部分

本文是我们的NoClassDefFoundError故障排除系列的第3部分。 正如我在第一篇文章中提到的那样,有许多可能导致NoClassDefFoundError的问题。 本文将重点介绍该问题的最常见原因之一:Java类静态初始化程序块或变量的失败。 将提供一个示例Java程序&#xf…

django实现瀑布流、组合搜索、阶梯评论、验证码

django实现图片瀑布流布局 我们在一些图片网站上经常会看到,满屏都是图片,而且图片都大小不一,却可以按空间排列。默认一个div是占用一行,当想把div里的图片并排显示的时候,只能使用float属性,但是&#xf…

通过ifrmae异步下载文档

//通过ifrmae异步下载文档 function iframeGetFile(opts) {var defaultOpts {filePath: ,onload: function (e) { }}, iframeFile;$.extend(defaultOpts, opts);iframeFile document.createElement("iframe");iframeFile.onload function (e) {defaultOpts.onload…

IO与NIO –中断,超时和缓冲区

假设有一个系统有时需要将文件复制到几个位置,但是这种方式在响应速度至关重要的情况下。 换句话说,如果由于某种原因文件系统过载,并且我们无法在不到一秒钟的时间内写入文件,则应该放弃。 ExecutorService是一项非常方便的工作工…

实验5 matlab程序设计2,实验5 Matlab程序设计2

实验5 Matlab程序设计21. 实验目的:2. 掌握建立和执行M文件的方法; 3. 掌握实现选择结构的方法; 4. 掌握实现循环结构的方法。5. 熟悉利用向量运算来代替循环操作的方法。 6. 实验内容:27. 根据61111 122232n2,求π的近…

【poj1041】 John's trip

http://poj.org/problem?id1041 (题目链接) 题意 给出一张无向图,求字典序最小欧拉回路。 Solution 这鬼畜的输入是什么心态啊mdzz,这里用vector储存边,便于边的排序。瞬间变成STL常数boy →_→。 细节 数组大小把握好。 代码 // poj1041 #i…

记一次ora-1652错误的解决过程

报错现象: 通过v$RMAN_BACKUP_JOB_DETAILS查看备份状态,一直卡着不出结果,很长一段时间之后抛出ORA-1652: unable to extend temp segment by 128 in tablespace ,此时查看临时表空间使用情况,发现占用很少&#xff0c…

带有docx4j的Java Word(.docx)文档

几个月前,我需要创建一个包含许多表和段落的动态Word文档。 过去,我曾使用POI来实现此目的,但是我发现它很难使用,并且在创建更复杂的文档时对我来说效果不佳。 因此,对于这个项目,经过一番搜索&#xff0c…

mysql中distinct关键字,MySQL关键字Distinct的详细介绍

DDLPrepare SQL:?Prepare Data:?查询数据如下图所示:第一种情况,使用Distinct关键字,查询单列数据,如下图所示:结果:对 name 字段进行去重处理,符合预期期望&#xff0…

#pragma 预处理指令

Linux C 编程一站式学习 #pragma 预处理指示供编译器实现一些非标准的特性,C 标准没有规定 #pragma 后面应该写什么以及起什么作用,由编译器自己规定。有的编译器用 #pragma 定义一些特殊功能寄存器名,有的编译器用 #pragma 定位链接地址&…

px ,em ,rem

做移动端或者响应式的页面必然需要字体的变化的。这次我就自己的经验来说说他们之间的关系,以及怎么用。 px (绝对单位)是我们常用的就不说了。 em(相对单位,相对父级) em 指字体高,任意浏览器的默认字体高都是16px。所…

使用JAnnocessor生成Java代码

在本文中,我将向你展示如何生成的代码JAnnocessor通过创建框架Nikolche Mihajlovski 。 在Nikolche的演讲中,我第一次在GeeCON 2012大会上遇到JAnnocessor: “创新和实用的Java源代码生成” (幻灯片) 。 之后&#xff…

Linq学习笔记(转)

开始Linq前你要知道的 扩展方法 顾名思义就是对现有类进行扩展的的方法,扩展方法可以在不修改现有类的情况下,为现有类增加公共的接口(不是C#中的interface)。 扩展方法本质上是一个静态方法,不同之处在于它的第一个参…

cass展点不在原位置,cass中打开一副图后,通过绘图处理-——展高程点,怎么之前的图形就不显示了,,只剩下高程点!!...

答:1、进入控制面板,选择“卸载或更改程序”。 2、选中“AutoCAD2006”图标。 3、右击选择“更改”。 4、进入“AutoCAD2006安装程序对话框”,选择“添加/删除功能”单选按钮,点击下一步。 5、在“程序文件”列表中,选…

(二)windows下安装PHPCMS V9

一、准备工作 搭建环境 :参考:Windows下搭建PHP开发环境及相关注意事项PHPCMS V9 :下载适合自己 PHPCMS V9 版本到本地或服务器,下载地址:http://www.phpcms.cn/html/download/说明:官方提供了 2 种不同的编码。包括 G…

JavaFX 2.0布局窗格– HBox和VBox

如果要对JavaFX 2.0中所有不同的布局窗格进行概述,或者想了解有关它们的一些基本知识,请参阅我以前的文章《 JavaFX 2.0中的布局窗格》 。 布局窗格HBox和VBox绝对是JavaFX 2.0中最基本的布局容器。 如您所知,它们的用途是将所有子级布置在一…