线程数

Java并发编程之线程池的使用

旧街凉风 提交于 2019-12-03 04:35:25
1. 为什么要使用多线程? 随着科技的进步,现在的电脑及服务器的处理器数量都比较多,以后可能会越来越多,比如我的工作电脑的处理器有8个,怎么查看呢? 计算机右键--属性--设备管理器,打开属性窗口,然后点击“设备管理器”,在“处理器”下可看到所有的处理器: 也可以通过以下Java代码获取到处理器的个数: System.out.println("CPU个数:" + Runtime.getRuntime().availableProcessors()); 运行结果如下所示: CPU个数:8 既然处理器的个数增加了,如果还使用传统的串行编程,就有点浪费资源了,因此,为了提高资源利用率,让各个处理器都忙碌起来,就需要引入并发编程,要引入并发编程,就引入了多线程。 可以说,使用多线程的最直接目的就是为了提高资源利用率,资源的利用率提高了,系统的吞吐率也就相应提高了。 2. 为什么要使用线程池? 在一定的范围内,增加线程可以提高应用程序的吞吐率,但线程并不是越多越好(因为线程的创建与销毁都需要很大的开销),如果超过了某个范围,不仅会降低应用程序的执行速度,严重的话,应用程序甚至会崩溃,以至于不得不重启应用程序。 为了避免这种问题,就需要对应用程序可以创建的线程数量进行限制,确保在线程数量达到限制时,程序也不会耗尽资源,线程池就是为了解决这种问题而出现的。 线程池:管理一组工作线程的资源池。

线程池

匿名 (未验证) 提交于 2019-12-03 00:39:02
  线程的创建需要时间。如果存在多个任务需要完成,则可以事先创建许多线程,在应该完成任务时发出需求线程请求。线程数最好时动态的增加于减少。TheadPool类可以托管线程列表,这个类能动态增加于减少线程的线程数,直到最大线程数----可配置。在四核CPU中,默认为1023个工作线程和1000个I/O线程。也可以指定创建线程池时应该立即启动的最小线程数,以及可用最大线程数。如果有新的任务,但是线程池中已没有闲于线程,那么新任务需要排队,等待线程完成其任务。如下示例: static void Main() { int nWorkerThreads; int nCompletionPortThreads; ThreadPool.GetMaxThreads( out nWorkerThreads, out nCompletionPortThreads); Console.WriteLine( " Max worker threads: {0}, I/O completion threads: {1} " , nWorkerThreads, nCompletionPortThreads for ( int i = 0 ; i < 10 ; i++ ) { ThreadPool.QueueUserWorkItem(JobForAThread); // WaitCallback类型委托

OpenMP设置线程数及开启方法

匿名 (未验证) 提交于 2019-12-03 00:26:01
1. OpenMP线程数设置 (1) 查看核心数: (2) OpenMP获取CPU核心数: omp_get_num_procs() 函数会返回机器的核心数 (3)OpenMP设置线程数: #pragma omp parallel for num_threads(2*numProcs-1) 2. VS开启OpenMP支持 文章标 转载请标明出处: OpenMP设置线程数及开启方法 文章来源: OpenMP设置线程数及开启方法

jmeter梯度加压请求数

匿名 (未验证) 提交于 2019-12-03 00:14:01
在压力测试时,可能需要使用jmeter的梯度加压。而在使用梯度加压时,大部分tester会对这一点疑惑:设置的总线程是100,但聚合报告中线程数远超100个 ,为什么梯度加压会有这样的现象?用事实说话,本文用示例去解释这一点。 环境: 先设置梯度加压的场景,访问某网站,具体如下: 从这个梯度加压设置的参数,我们可以看出设置的总线程数为50个,每2s增加5个,在1s内增加完成;然后线程保持30s;再然后,每2s停掉5个线程。 要正确理解最终请求数,需要明白每一秒钟线程释放了多少请求 分析: 在梯度加压有三个阶段:梯度加压、持续负载、线程释放。 梯度加压: 如果该请求的平均响应时间是100ms,那么1s钟该请求可以迭代10次; 那么在1s内如果启动了5个线程,这1s内发出的请求数就是5*10=50次 接着运行2s后才开始加载下一波线程,在这2s内,它发出的请求数是2*5*10=100次 在2s之后,线程组又在1s内释放5个请求,并运行2s,在这2s内,它发出的请求数是2*10*10=200次(此时是10个线程在运行) 以此类推,直到50个线程加载完之前,线程释放的请求数是这样的:(2*5*10)+(2*10*10)+(2*15*10)+(2*20*10)+(2*25*10)+....+(2*45*10)=4500次 持续负载: (注意:为什么最后不是2*50*10呢

ThreadPoolExecutor带来的性能问题

匿名 (未验证) 提交于 2019-12-02 23:52:01
使用线程池,一般情况下会带来性能提升,并且使用线程池管理线程,减少了每个任务调用的开销,通常可以在执行大量异步任务时提供增强的性能。 但是在高并发的情况下,会因为使用不当导致性能下降,并且下降得比较严重,下面来讲解一下原因。 ThreadPoolExecutor是jdk1.5版本增加的,在java.util.concurrent包中。 构造方法摘要 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) 各个参数说明: corePoolSize - 池中所保存的线程数,包括空闲线程。 maximumPoolSize - 池中允许的最大线程数。 keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。 unit - keepAliveTime 参数的时间单位。 workQueue - 执行前用于保持任务的队列。 在系统设计时,采用了ArrayBlockingQueue,防止资源耗尽带来的系统问题,但是这个队列在高并发的情况下,会因为线程的上下文切换开销,导致队列排队,任务频繁阻塞,从而导致系统出现严重的性能问题。

JMeter性能测试,完整入门篇

匿名 (未验证) 提交于 2019-12-02 23:43:01
原文转自: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

并行流适用场景-CPU密集型

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/larva_s/article/details/90403578 文章目录 1. 场景描述 2. 原因猜测 3. 测试 3.1 默认并行流线程数 3.2 提高并行流线程数 3.3 测试结果:6w个任务 4. 总结 4.1 I/O密集型 4.1 CPU密集型 5. 参考资料 1. 场景描述 2. 原因猜测 3. 测试 @Service public class ConsumMsg { @Autowired StreamOpt streamOpt ; /** * 初始化任务队列 * @param count * @return */ public List < Integer > initMsg ( int count ) { List < Integer > list = Lists . newArrayList ( ) ; for ( int i = 0 ; i < count ; i ++ ) { list . add ( i ) ; } return list ; } /** * 并行流处理 * @param count */ public void parallel ( int count ) { List < Integer > list = initMsg ( count )

如何使用好线程池?

匿名 (未验证) 提交于 2019-12-02 23:03:14
如何使用好线程池? 线程个数大小的设置 线程池相关参数的配置 利用Hook嵌入你的行为 线程池的关闭 线程池数量的设置,你的依据是什么? 计算机密集型 应用需要非常多的CPU计算资源,避免过多的线程上下文切换 线程数 = CPU核数+1,已可以设置为CPU核数*2,还要看JDK的版本以及CPU配置(服务器的CPU有超线程) IO密集型 Web应用,涉及到大量的网络传输,不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束后,数据准备好后,线程才会继续执行。对于IO密集型的应用,我们可以多设置线程池中线程的数量,这样就能让等待IO的这段时间内,线程可以去做其它事,提高并发处理效率。线程上下文切换数有代价的 线程数 = CPU核数/(1-阻塞系数) 这个阻塞系数一般为0.8~0.9之间。 套用公司:对于双核CPU来说,比较理想的线程数就是20,当然这不是绝对的,需要根据实际情况以及实际业务来调整:final int poolSIze = (int)(copCore/(1-0.9)) 线程池相关参数如何配置? 高压线: 我们使用线程池的时候都不要选择没有上限限制的配置项 第一 我们不要去使用没有上限的线程池和设置无界队列! 比如,newCachedThreadPool的设置与无界队列因为某些不可预期的情况,线程池会出现系统异常

linux线程数限制与zabbix监控

匿名 (未验证) 提交于 2019-12-02 21:53:52
Linux最大线程数限制及当前线程数查询 最大线程数计算方式: n = total_memory/128k; Linux用户线程数限制而导致的程序异常为 java.lang.OutOfMemoryError:unable to create new native thread 查询系统支持的最大进程数与线程数,一般会很大,相当于理论值 /proc/sys/kernel/pid_max /proc/sys/kernel/threads-max 系统限制某用户下最多可以运行多少进程或线程 当前用户可用最大线程数:ulimit -u 想要修改这个值: centos 6.*可以修改/etc/security/limits.d/90-nproc.conf centos 7.*可以修改/etc/security/limits.d/20-nproc.conf 查询当前某程序的线程或进程数 # pstree -p `ps -e | grep java | awk '{print $1}'` | wc -l 上面用的是管道,关于管道:管道符号"|"左边命令的输出作为右边命令的输入 查询当前整个系统已用的线程或进程数 pstree -p | wc -l 以上参考 https://www.cnblogs.com/nizuimeiabc1/p/5593637.html zabbix监控当前使用线程数

记录一次线程池的在项目中的实际应用,讲解一下线程池的配置和参数理解。

匿名 (未验证) 提交于 2019-12-02 21:53:52
前言:最近项目中与融360项目中接口对接,有反馈接口(也就是我们接收到请求,需要立即响应,并且还要有一个接口推送给他们其他计算结果),推送过程耗时、或者说两个接口不能是同时返回,有先后顺序。 这时我想到了把自己Controller立即返回接受成功,中间添加一个新的线程去做其他耗时的操作(线程池配置和参数测试讲解请阅读第5步)。 1、Controller代码如下: @Autowiredprivate CallThreadDemo worker; @RequestMapping("/bandBankConfirm2") public void bandBankConfirm2(String jsonString) { System.out.println("controller开始--------------");    //这里是需要调用第三方的接口传入参数 String method = "is.api.v3.order.bindcardfeedback"; Map<String, Object> map = new HashMap<>(); map.put("order_no", "254986512848973"); map.put("bind_status", 1); map.put("reason", "");     //这里开始调用线程池的方法 worker