线程数

面试问我,创建多少个线程合适?我该怎么说

*爱你&永不变心* 提交于 2020-04-08 08:54:43
| 如果好看,请给个赞 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star 为什么要使用多线程? 防止并发编程出错最好的办法就是不写并发程序 既然多线程编程容易出错,为什么它还经久不衰呢? A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】 我也很赞同这个答案,但说的不够具体 并发编程适用于什么场景? 如果问你选择多线程的原因就是一个【快】字,面试也就不会出那么多幺蛾子了。你有没有问过你自己 并发编程在所有场景下都是快的吗? 知道它很快,何为快?怎样度量? 想知道这两个问题的答案,我们需要一个从【定性】到【定量】的分析过程 使用多线程就是在正确的场景下通过设置正确个数的线程来最大化程序的运行速度(我感觉你还是啥也没说) 将这句话翻译到硬件级别就是要充分的利用 CPU 和 I/O 的利用率 两个正确得到保证,也就能达到最大化利用 CPU 和 I/O的目的了。最关键是,如何做到两个【正确】? 在聊具体场景的时候,我们必须要拿出我们的专业性来。送你两个名词 buff 加成 CPU 密集型程序 I/O

面试问我,创建多少个线程合适?我该怎么说

故事扮演 提交于 2020-04-08 08:30:46
| 如果好看,请给个赞 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star 为什么要使用多线程? 防止并发编程出错最好的办法就是不写并发程序 既然多线程编程容易出错,为什么它还经久不衰呢? A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】 我也很赞同这个答案,但说的不够具体 并发编程适用于什么场景? 如果问你选择多线程的原因就是一个【快】字,面试也就不会出那么多幺蛾子了。你有没有问过你自己 并发编程在所有场景下都是快的吗? 知道它很快,何为快?怎样度量? 想知道这两个问题的答案,我们需要一个从【定性】到【定量】的分析过程 使用多线程就是在正确的场景下通过设置正确个数的线程来最大化程序的运行速度(我感觉你还是啥也没说) 将这句话翻译到硬件级别就是要充分的利用 CPU 和 I/O 的利用率 两个正确得到保证,也就能达到最大化利用 CPU 和 I/O的目的了。最关键是,如何做到两个【正确】? 在聊具体场景的时候,我们必须要拿出我们的专业性来。送你两个名词 buff 加成 CPU 密集型程序 I/O

ThreadPoolExecutor 的基本原理

﹥>﹥吖頭↗ 提交于 2020-04-07 15:37:21
先说下 ThreadPoolExecutor 的基本原理: 1. 当提交一个任务时,如果线程数没有达到coreSize,那么就会新建一个线程,并绑定该任务,直到数量到达coreSize前都不会重用之前的线程 2.到达后,提交的任务都会放到一个等待队列中进行等待,线程池中的线程会使用take()阻塞的从等待队列拿任务 3.当队列有界,并且线程不能及时取走队列中的任务,等待队列有可能会满,那么线程池将会创建临时线程来执行任务 4.临时线程 通过poll(keepAliveTime,timeUnit)来执行任务,如果到了keepAliveTime还取不到,那么会被回收掉,临时线程的数量不能大于 maxPoolSize - coreSize 5.当线程数到达maxSize后,将会执行拒绝策略RejectedExecutionHandler,包括抛异常,静默拒绝,抛弃最old任务,使用原远程执行等策略 知道了原理你大概就知道线程被如何管理了 当一个task执行完,如果线程数小于coreSize,那么这个线程就会一直存在线程池中, 如果是临时线程,在等待keepAliveTime后,将会被回收掉 来源: https://www.cnblogs.com/zjm-1/p/12653532.html

ThreadPoolExecutor简单测试

南笙酒味 提交于 2020-04-07 10:33:05
ExecutorService exe = Executors. newFixedThreadPool (4); ThreadPoolExecutor(4,4,0L, TimeUnit.MILLSECONDS, new LinkedBlockingQueue<Runnable>()); 结果: 1. 当开始运行时,线程池中的线程小于 corePoolSize 时,开启新的线程 ; 2. 当新的任务添加,线程池线程超过 corePoolSize 时,任务放在队列中; 3. 实际运行的线程最大不超过 maximumPoolSize ,即 4 ; 4. queueSize=getTaskCount-getCompletedTaskCount-getActiveCount ; 5. 提交的任务不一定是按提交顺序完成运行,如提交顺序是 id_1,id_2,id_3,id_4 ,可能id_ 4 最先完成执行。 ExecutorService exe = Executors. newCachedThreadPool (); ThreadPoolExecutor(0, Integer. MAX_VALUE , 60L, TimeUnit. SECONDS , new SynchronousQueue<Runnable>()); 结果 : 1. 当新的任务添加,线程池中无空闲线程时,创建新的线程

Hbase优化

|▌冷眼眸甩不掉的悲伤 提交于 2020-04-07 09:34:45
一:高可用 1):关闭集群    stop-hbase.sh 2):在conf目录下创建 backup-masters 文件    touch backup-masters 3):backup-masters文件中配置高可用 HMaster 节点    echo k200 > backup-masters 4):将整个 conf 目录 scp 到其他节点    scp -r /soft/hive/conf/ k200:/soft/hive/ 5):打开页面测试 二:Hadoop 的通用性优化 1):NameNode 元数据备份使用 SSD 2):定时备份NameNode 上的元数据    通过定时任务复制元数据目录即可 3):为 NameNode 指定多个元数据目录    使用 dfs.name.dir 或者 dfs.namenode.name.dir 指定。这样可以提供元数据的冗余和健壮性,以免发生故障。 4):NameNode的 dir 自恢复    设置 dfs.namenode.name.dir.restore 为 true,允许尝试恢复之前失败的dfs.namenode.name.dir目录,在创建 checkpoint时做此尝试,如果设置了多个磁盘,建议允许。 5):HDFS保证 RPC 调用会有较多的线程数    hdfs-site.xml:    属性:dfs

Jmeter各类线程组详解

久未见 提交于 2020-04-06 06:03:45
Jmeter各类线程组详解 作者:牛刘源 了解JMeter的朋友都知道,它不仅能做简单的接口测试、还支持性能测试,接口类型不仅支持Rest、SOAP,也可扩展WebSocket、Socket等。无论你用Jmeter做哪种测试,哪种接口类型,哪种网络协议,你都必须添加使用Jmeter线程组,线程组在Jmeter中占据主导地位,它是任何一个测试计划的起点,所有的逻辑控制器、采样器、处理器、报告等都必须放在线程组之下,也就是说你若使用Jmeter做接口测试或性能测试那么,线程组是必不可少的。本文分为三个方面为大家介绍Jmeter的线程组,主要从: 线程组介绍、线程组设置、线程组分类三 方面来阐述。 一、线程组介绍: 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组: 通俗理解: · 线程组:就是一个线程组,里面有若干个请求; · 线程:一个线程就是一个“虚拟用户”; · 请求:一个线程组里面有若干个请求。 对应关系: 例如:1个线程组里面有10个请求,线程数为10个,跑完后得到: 理解为:(10个线程数)10个人,每个人都要跑这10个请求,所以:10*10=100: 并发数:100;线程数:10; PS:线程组也可以看作是一个虚拟用户组。线程组中的每一个线程都可以理解为一个虚拟用户。 二、线程组设置:

谈谈Java的线程池设计

懵懂的女人 提交于 2020-04-02 20:16:53
在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了)。这种情况下,最好是将任务提交给线程池执行。 所谓池,就是将管理某一种资源,对资源进行复用的对象。线程池就是对线程管理的对象。 本文就是介绍线程池内部是如何管理线程,并复用线程的。 相关接口 JDK在内部对线程池提供了大致四层的接口(类)用来提供线程池的行为,分别是顶层接口 Executor (这个接口可以理解为执行器,负责执行任务,),可关闭的执行器 ExecutorService (这个接口开始才具备线程池的概念),提供线程池基本框架的抽象类 AbstractExecutorService ,以及线程池的具体实现 ThreadPoolExecutor 。 Executor /** * 线程池顶层接口 * 可以执行提交的命令 */ public interface Executor { /** * 执行提交的命令 * @param command */ void execute(Runnable command); } Executor 只定义了线程池一个行为 execute() 方法,负责执行提交的任务。 ExecutorService package java.util.concurrent; import java.util.List; import java

系统性能

半城伤御伤魂 提交于 2020-04-01 02:55:59
1、性能相关数据: • 系统用户数:决定数据量,对处理速度有影响,可事先评估 • 在线用户数:决定访问压力的主要数据,反映总体处理能力的指标 • 思考时间:影响访问压力的重要因素 • 响应时间:反映系统处理个别请求速度快慢的指标 • 吞吐率:反映总体处理速度的指标 • 并发数:反映总体处理能力的指标 • 资源占用率:由访问压力决定,反映系统负荷程度的指标 2、性能指标 单一业务 • 吞吐率:系统单位时间内可处理的业务量 • 并发数:系统可同时处理的最大请求数 • 响应时间:从用户发起请求到请求完成所花费的时间 复合业务 • 在线用户数:在一定时间区间内对系统产生了访问的用户数。对于后端存在多个 接口或功能的系统,不方便用单一的吞吐率来表示系统的处理能力,因此可以间 接的用前端在线用户数来表示,其中隐含了各个功能或接口被使用的比例。 • 响应时间:从用户发起请求到请求完成所花费的时间 3、分析工具- nmon nmon 工具可以为 Linux 性能专家提供监视和分析性能数据的功能,包括: • CPU 使用率 • 内存使用情况 • 磁盘 I/O 速度、传输和读/写比率 • 文件系统中的可用空间 • 网络 I/O 速度、传输和读/写比率 • 消耗资源最多的进程 4、中间件配置优化 - nginx • worker_processes 8; nginx进程数,建议按照cpu数目来指定

06:线程池

六月ゝ 毕业季﹏ 提交于 2020-03-30 22:48:15
1:线程池原理-基本概念: 1:线程池管理器:用户管理线程池。包括创建线程池、销毁线程池,添加新任务等。 2:工作线程:工作线程就是线程池中实际工作的线程。没有任务时:处于等待状态,有任务时:可以循环的执行任务。 3:任务接口:每个任务都需要实现的接口。规范了任务的输入、输出等。 4:任务队列:任务太多时,超过了线程池处理能力。将待处理的任务放到等待队列中。 2:线程池接口和实现类: 1:接口:Executor:最上层的接口:定义了执行任务的方法:executor() 2:接口:ExecutorService:继承了Executor接口,扩展了Callable,Future,关闭方法。 3:接口:ScheduledExecutorService:继承了ExecutorService,怎加了定时任务相关的方法。 4:实现类:ThreadPoolExecutor:标准的线程池实现。但是比较基础。 5:实现类:ScheduledThreadPoolExecutor:继承了ThreadPoolExecutor,实现了ScheduledExecutorService。也就是说:在标准的线程池类基础上怎加了定时任务。 3:ThreadPoolExecutorc测试: /** * 1:核心线程数量5,最大数量10,无界队列,超出核心线程数量的线程存活时间5秒。 */ //

面试刷题20:并发包中的线程池有哪些?

纵然是瞬间 提交于 2020-03-30 17:29:32
java提供的线程池可以简化线程管理,提高线程资源的利用率。 大家好,我是李福春,今天的题目是: Java提供了哪些线程池?如何设置合适的线程池大小? 答:java.util.concurrent包中提供了5种线程池,从简单到复杂列举如下: 一,newSingleThreadExecutor() ,单线程池,任何时候工作线程都是1个,队列是无界队列保证任务的顺序执行; 二,newFixedThreadPool(int),固定数量的线程池,任何时候工作线程都是N,内部使用的无界队列; 三,newCachedThreadPool()缓存线程池,适合处理大量短时间执行的任务; 四,newWorkStealingPool(int)工作窃取线程池,java8引入,内部使用ForkJoinPool实现 五,newScheduledThreadPool(),适合处理定时或者周期性的任务 如何合理设置线程池大小? 需要综合计算任务的特点来。 cpu耗费较高的,核心线程数一般设置为N(cpu核心数) 等待任务较多的,核心线程数一般设置为 N cpu利用率 (1+平均等待时间/平均执行时间) 同时在使用线程池的时候,注意一下5点: 1, 避免任务堆积 2,避免过度扩展线程,以及避免线程泄露; 3,避免死锁,合理使用各种锁; 4,避免使用ThreadLocal; 线程池参数 线程池的结构如下图: