线程数

Java原理领悟-线程池(Executor)

[亡魂溺海] 提交于 2019-12-06 06:48:00
线程池全面解析 什 么是线程池?   很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用。 线程池的好处   我们知道不用线程池的话,每个线程都要通过new Thread(xxRunnable).start()的方式来创建并运行一个线程,线程少的话这不会是问题,而真实环境可能会开启多个线程让系统和程序达到最佳效率,当线程数达到一定数量就会耗尽系统的CPU和内存资源,也会造成GC频繁收集和停顿,因为每次创建和销毁一个线程都是要消耗系统资源的,如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。    所以,线程池中的线程复用极大节省了系统资源,当线程一段时间不再有任务处理时它也会自动销毁,而不会长驻内存。 线程池核心类  在java.util.concurrent包中我们能找到线程池的定义,其中 ThreadPoolExecutor是我们线程池核心类,首先看看线程池类的主要参数有哪些。 corePoolSize:线程池的核心大小,也可以理解为最小的线程池大小。 maximumPoolSize:最大线程池大小。 keepAliveTime:空余线程存活时间,指的是超过corePoolSize的空余线程达到多长时间才进行销毁。 unit:销毁时间单位。 workQueue

C# .net 提升 asp.net mvc, asp.net core mvc 并发量

此生再无相见时 提交于 2019-12-06 06:29:04
1.提升System.Net.ServicePointManager.DefaultConnectionLimit 2.提升最小工作线程数 使用ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads); 方法可以得到当前“最小工作线程数”和“最小IO工作线程数”,这两个值默认等于CPU核心数,我这里等于6. 显然,这点并发处理能力是不够的。需要提升,但又不能超过“最大工作线程数”除以2,超过后,又被还原成默认值了。 方式一,在代码中加大(.net mvc 在Application_Start(),.net core mvc 在Program.Main ,只要在合适的时机调整即可): 、 StringBuilder scLog = new StringBuilder(); try { scLog.AppendLine("默认的 System.Net.ServicePointManager.DefaultConnectionLimit:" + System.Net.ServicePointManager.DefaultConnectionLimit.ToString()); if (System.Net.ServicePointManager.DefaultConnectionLimit <= 300)

JAVA多线程实战

微笑、不失礼 提交于 2019-12-06 05:06:36
背景 由于项目上要和其他系统交互,而该系统采用同步接口,我们采用单线程调用,接收一条数据平均需要4~6s。而我们需要汇总近三个月的订单信息,大约一次有几千条数据,所以进行一次交互大概需要几百分钟。经过沟通后,对方系统不愿意修改他们的程序,所以我们这边就要改成多线程多次同时调用接口,来达到降低处理时间的效果。 代码 话不多说,先上代码 public ReturnT execute(Map<String, String> map, SchedulerTool tool) { tool.info("<==== MakeOrderOutJob is starting: " + map); //获取最大线程数 int threadNum = Integer.parseInt(map.get("threadNum")); //获取线程结束超时时间 int timeOut = Integer.parseInt(map.get("timeOut")); //获取传输最大条数 int max = Integer.parseInt(map.get("max")); //获取待发送的生产订单数据 List<MakeOrder> makeOrderList = makeOrderRepository.getMakeOrder(max); tool.info("<==== MakeOrderOutJob

05 - Tomcat 线程池的配置与优化

隐身守侯 提交于 2019-12-06 01:59:03
添加 Executor 在server.xml中的Service节点里面,增加executor节点,然后配置connector的executor属性,如下: <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="3000" minSpareThreads="5" maxSpareThreads="20" acceptCount="20" /> 参数说明: namePrefix:线程池中线程的命名前缀。 maxThreads:Tomcat 可用于处理请求的最大线程数,默认是200。 minSpareThreads:Tomcat线程池的最小空闲线程数,等于初始的线程数。 maxSpareThreads:Tomcat最大空闲线程数,超过的会被关闭。 maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭。 acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认100。 配置 Executor 在Connector中指定上面的 Executor <Connector executor="tomcatThreadPool" protocol="org.apache.coyote.http11

JMeter性能测试,完整入门篇

纵然是瞬间 提交于 2019-12-06 00:26:07
原文转自:https://blog.csdn.net/lovesoo/article/details/78579547 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。 本文为JMeter性能测试完整入门篇,从Jmeter下载安装到编写一个完整性能测试脚本、最终执行性能测试并分析性能测试结果。 运行环境为Windows 10系统,JDK版本为1.8,JMeter版本为3.3。 2. Jmeter安装 2.1 JDK安装 由于Jmeter是基于java开发,首先需要下载安装JDK (目前JMeter只支持到Java 8,尚不支持 Java 9) 1. 官网下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 2. 选择Java SE 8u151/ 8u152,点击JDK下载 3. 安装下载的JDK 4. 配置系统环境变量 2.2 JMeter安装 官网下载地址: http://jmeter.apache.org/download_jmeter.cgi 下载最新JMeter 3.3版本:apache-jmeter-3.3.zip

线程池ThreadPoolExecutor的使用方法

妖精的绣舞 提交于 2019-12-05 23:52:01
方法我们通过继承Thread类和实现runnable接口或者callable接口三种方式实现。 继承Thread类实际上也是实现了runnable接口,被继承的类主要是实现run()方法,通过start()方法调用。 而callable接口是属于Executor 对比与Runnable接口功能的区别是: (1).Callable可以在任务结束后提供一个返回值,Runnable没有这个功能 (2).Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常 (3).运行Callable可以拿到一个Future对象,Future独享表示异步计算的结果,它提供了检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数 的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况,放调用Future的get()方法以获取结果时,当前线程就会阻塞,知道call()方法结束返回结果。我们可以使用多线程来达到最优效率,但是,线程不是越多就越好,线程过多,创建和销毁就会消耗系统的资源,也不方便管理。 除此之外,多线程还会造成并发问题,线程并发数量过多,抢占系统资源从而导致阻塞。 我们将线程放入线程池,由线程池对线程进行管理,可以对线程池中缓冲的线程进行复用,这样,就不会经常去创建和销毁线程了,从而省下了系统的资源

性能测试:深入理解线程数,并发量,TPS,看这一篇就够了

喜欢而已 提交于 2019-12-05 22:39:04
并发数,线程数,吞吐量,每秒事务数(TPS)都是性能测试领域非常关键的数据和指标。 那么他们之间究竟是怎样的一个对应关系和内在联系? 测试时,我们经常容易将线程数等同于表述为并发数,这一表述正确吗? 本文就将对性能领域的这些关键概念做一次探讨。 文章可能会比较长,希望您保持耐心看完。 1. 走进开封菜,了解性能 ①老王开了家餐厅 我们的主角老王 ,在M市投资新开业了一家 ,前来用餐的顾客络绎不绝: 餐厅里有4种不同身份的人员: 用户一次完整的用餐流程如下: 顾客到店小二处付款点餐 => 小二将订单转发给后厨 => 后厨与备菜工配合,取材完成烹饪后交给小二 => 小二上菜,顾客用餐。 假设所有顾客都不堂食而是打包带走,也就是不考虑用户用餐时间。餐厅完成一次订单的时间是多久? 订单时间 = 顾客点单时间 + 前台接收转发时间 + 后厨取材烹饪时间 + 后厨交给服务员,服务员上菜时间。 说白了就是每个流程的耗时相加。 假设以上时间分别为1,1,5,1(分钟),那么一次订单的完成时间就是8分钟。 ②问题来了 餐厅当然不可能只有一个人就餐,否则老王不要带着小姨子跑路。 所以我们接下来看多人就餐的情况。 假设同一时间点上有两人 就餐,会发生什么情况? 第一位用户与第一个场景一样,仍然是点单-下单-烹饪-上菜,8分钟后第一位顾客拿着打包的食物离开。 第二位用户则有所不同了。假设小二,厨师

小贞贞jmeter基于python的分布式

白昼怎懂夜的黑 提交于 2019-12-05 19:17:17
jmeter进行分布式压力测试:所谓分布式,即一台作为控制机,去控制其他多台负载机一起去运行我们的测试脚本,最终对我们的被测系统产生压力 本期python脚本实现: 1.从excel表中读取配置的执行时间、线程数、IP和端口等 2.拼接命令 jmeter -n -t jmx脚本的路径 -R负载机的ip:端口,负载机的IP:端口 -J脚本中设置的关于线程数变量 -J脚本中设置的启动时间变量 -l 测试结果路径 -e -o 测试html报告路径 例如: jmeter -n -t .\jmeter_script\TCtestcase_xn\TC_testscript.jmx -R 10.5.32.XX:1099,10.5.32.XX:1099 -J thread_num=30 -J runup_time=2 -J run_time=10 -l .\test_result\test_jtl\test2019-11-27-11-36-24.jtl -e -o .\test_result\test_html\HTML2019-11-27-11-36-24 一:环境准备 环境:linux服务器 控制机 负载机:都为Windows 确保:控制机与负载机在同一个网段,即IP前三位需要相同 ,要求能相互ping通 环境准备: 1.负载机和控制机安装相同版本的JDK(1.8版本及以上)

tomcat6 高并发配置 与优化

那年仲夏 提交于 2019-12-05 18:48:58
tomcat 的 server.xml 配置文件说明: server.xml 配置 1. port = "8080" protocol = "HTTP/1.1" 2. maxThreads = "30000" 3. minSpareThreads = "512" 4. maxSpareThreads = "2048" 5. enableLookups = "false" 6. redirectPort = "8443" 7. acceptCount = "35000" 8. debug = "0" 9. connectionTimeout = "40000" 10. disableUploadTimeout = "true" 11. URIEncoding = "UTF-8" /> 参数说明 : connectionTimeout 网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。 keepAliveTimeout 长连接最大保持时间(毫秒)。此处为 15 秒。 maxKeepAliveRequests 最大长连接个数( 1 表示禁用, -1 表示不限制个数,默认 100 个。一般设置在 100~200 之间) maxHttpHeaderSize http 请求头信息的最大程度,超过此长度的部分不予处理。一般 8K 。

线程池的C++实现(一)

若如初见. 提交于 2019-12-05 18:03:19
  现代的软件一般都使用了多线程技术,在有些软件里面,一个线程被创建出来执行了仅仅一个任务,然后就被销毁了。线程的创建与销毁是需要消耗资源,这样为了执行单一任务而被创建出来的线程越多,性能也就越差。如果能意识到线程仅仅是负责指令流的执行,并重复利用同一个线程去执行多个函数,将线程的创建和销毁的次数控制在有限次内,频繁创建与摧毁线程这种不必要的开销就能够有效避免。   线程池就是这样一种将线程的创建与摧毁控制在一定次数内,并利用同一线程反复执行不同人任务的技术,当然,其中的线程数不止一条。线程池中线程的个数一般和硬件线程数量一致时(暂时不考虑当前线程和线程池以外的线程数),因为当进程中的线程数与硬件线程数一致时能达到最佳并发,C++语言中,硬件线程数可以由函数std::thread::hardware_concurrency()的返回值得到,函数返回的非0即为硬件线程数。   线程池内的线程一般在初始化时一起创建,在指定退出时一起退出。其中要执行任务的线程与外部线程通过一个线程安全的容器来实现交互,外部线程作为生产者往容器中添加任务,池中的线程作为消费者拿出线程中的任务去执行。当容器中没有任务时,池中的线程会阻塞直到得到通知并且容器中存放了任务(阻塞的线程不会得到系统调度器的调度)。   说了这么多,来看看线程池怎么实现的吧。先来看看头文件ThreadPool.h: #ifndef