线程池设置 | 线程池设置多少合适

线程池设置 | 线程池设置多少合适

1. 线程设置多少合适

多线程是为了能够让计算机资源合理的分配,对于处理不同的任务创建不同的线程进行处理,但是计算机创建一个线程或者销毁一个线程所花费的也是比较昂贵的,有时候需要同时处理的事情比较多,就需要我们频繁的进行线程的创建和销毁,这样花费的时间也是比较多的。为了解决这一问题,我们就可以引用线程池的概念。

所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作

在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们可以使用ThreadPoolExecutor来进行线程池的创建。

在ThreadPoolExecutor的构造方法中,有多个参数,可以配置不同的参数来进行优化。这个类的源码构造方法为:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)其中每个参数代表的意义分别为:

corePoolSize : 线程池中的核心线程数量,当线程池中当前的线程数小于这个配置的时候,如果有一个新的任务到来,即使线程池中还存在空闲状态的线程,程序也会继续创建一个新的线程放进线程池当中

maximumPoolSize: 线程池中的线程最大数量

keepAliveTime:当线程池中的线程数量大于配置的核心线程数量(corePoolSize)的时候,如果当前有空闲的线程,则当这个空闲线程可以存在的时间,如果在keepAliveTime这个时间点内没有新的任务使用这个线程,那么这个线程将会结束,核心线程不会结束,但是如果配置了allowCoreThreadTimeOut = true,则当空闲时间超过keepAliveTime之后,线程也会被结束调,默认allowCoreThreadTimeOut = false,即表示默认情况下,核心线程会一直存在于线程池当中。

unit : 空闲线程保持连接时间(keepAliveTime)的时间单位

workQueue:阻塞的任务队列,用来保存等待需要执行的任务。

threadFactory :线程工厂,可以根据自己的需求去创建线程的对象,设置线程的名称,优先级等属性信息。

handler:当线程池中存在的线程数超过设置的最大值之后,新的任务就会被拒绝,可以自己定义一个拒绝的策略,当新任务被拒绝之后,就会使用hander方法进行处理。

在java中也提供了Executors工具类,在这个工具类中提供了多个创建线程池的静态方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor等。但是他们每个方法都是创建了ThreadPoolExecutor对象,不同的是,每个对象的初始 参数值不一样;

2. 线程池数量怎么设置

两个思路 一个是设计标记位 一个资源类,类中有一个标记位,一个方法, 创建一个线程,方法中数值+1,数量达到10时标记为置为false,当然,这个方法一定需要加把锁。 结束一个线程,方法中数值-1,剩下的你应该知道吧。。。。

另一个思路就是定义线程池的标准线程数量 ,Executors.newScheduledThreadPool(int corePoolSize); 建议还是第一种吧。容易理解,操作方便。

3. 线程池一般设置多少个

线程池需要设置合适的大小,假如设置的太大,线程上线文切换过于频繁,造成大量资源开销,反而会使性能降低。假如设置的太小,存在很多可用的处理器资源却未在工作,会造成资源的浪费和对吞吐量造成损失。 为了充分利用处理器资源,创建的线程数至少要等于处理器核心数。如果所有的任务都是计算密集型的,那么线程数等于可用的处理器核心数就可以了。不过,如果所有的任务都是IO密集型,那么处理器大部分时间是空闲的,所有要适当的增加线程数。线程等待时间所占比例越高,需要越多线程。线程运算时间所占比例越高,需要越少线程。于是可以使用下面的公式进行估算:

最佳线程数 = (1 + 线程等待时间/线程计算时间)* 目标CPU的使用率 * 处理器核心数

例如:平均每个线程计算运行时间为0.5s,而线程等待时间(非计算时间,比如IO)为1.5s,目标CPU的使用率是90%,CPU核心数为8,那么根据上面这个公式估算得到:(1 + 1.5/0.5) * 90% * 8 = 28.8。 即使有上面的简单估算方法,也许看似合理,但实际上也未必合理,都需要结合系统真实情况(比如是IO密集型或者是CPU密集型或者是纯内存操作)和硬件环境(CPU、内存、硬盘读写速度网络状况等)来不断尝试达到一个符合实际的合理估算值,也可以尝试Dark Magic的估算方法。 欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

4. 线程池大小多少合适

根据机器大小决定设置多少。在tomcat虚拟内存为2G,建议设置最大线程为500~600,可支持最大并发量为500~600

在tomcat虚拟内存为4G,建议设置最大线程为600~700,可支持最大并发量为600~700

如果需要达到自身业务系统的最优配置,还是需要根据自身业务系统的场景进行逐步压力实测,再根据结果进行线程数的上调或下调。配置决定多少合适

5. 线程池线程数量设置多少最好

学习IOCP的时候,网上每个教程都强调,用来从完成队列取出数据的线程最好是 CPU数量的两倍。这是为了尽量减少线程的切换。这个我懂,一个网络库里面,会有多个线程池,比如从缓冲队列取出数据的,用来处理的,处理后加入缓冲区回发的,这些线程池合起来也会创建很多线程的,那么这不是一样的使得CPU切换的厉害么?是不是一个程序里面所有的线程合起来是CPU数量的2倍最好呢?(或者稍微多一点,达到一个平衡)比如一个灶台最好是两个厨师一起用好点,一个炒菜一个就去切菜,切好了让他来炒菜,这样就合理利用了,但是伙食管理员却并不能让灶台只是炒菜,它还需要用它来炖汤,或者烧热水(其他的处理线程),那这样一样的会导致灶台这里切换来切换去的,效率也会打折扣。那到底多少个线程最好呢??

6. 如何合理配置线程池的大小

不要盯着线程池,而是看问题在哪。

比如是任务太多,CPU太满,调大线程池无用。这时应该先加CPU,或者加机器。

如果CPU很富裕,是线程池上限卡住了,简单调大最大值即可。

如果是任务执行时间实在是太长了,让“请求在任务完成后再返回”这个设定不合适,造成用户体验差,那么应该将系统设计为启动任务后请求就返回+定时的ping任务完没完。

7. 线程池设置多大合适

pool = threadpool.ThreadPool(poolSize)poolSize这里来控制线程数量有线程池就可以控制

8. 线程池设置多大

这样的情况我们应该改变一个其他线程,或者是将线程池所有的数据信息清理。进入设置界面,选择数据清理恢复

9. 如何设置线程池参数比较合理

①工作线程数是不是设置的越大越好?

回答:肯定不是的

1)一来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个工作线程没有意义

2)线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低

②如果CPU是单核,设置多线程有意义么,能提高并发性能么?

回答:即使是单核,使用多线程也是有意义的

1)多线程编码可以让我们的服务/代码更加清晰

2)通常来说,Worker线程一般不会一直占用CPU进行计算,此时即使CPU是单核,增加Worker线程也能够提高并发,因为这个线程在休息的时候,其他的线程可以继续工作

一般来说,非CPU密集型的业务(加解密、压缩解压缩、搜索排序等业务是CPU密集型的业务),瓶颈都在后端数据库,本地CPU计算的时间很少,所以设置几十或者几百个工作线程也都是可能的。

N核服务器,通过执行业务的单线程分析出本地计算时间为x,等待时间为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化。

10. 线程池参数设置

需要进行接口限流。理由如下:

一、Hystrix 通过判断线程池或者信号量是否已满,超出容量的请求,直接 Reject 走降级,从而达到限流的作用

二、限流是限制对后端的服务的访问量,比如说对 MySQL、Redis、Zookeeper 以及其它各种后端中间件的资源的访问的限制,其实是为了避免过大的流量直接打死后端的服务,限制服务对后端的资源的访问。

11. 线程池怎么配置

一、需求        Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能。

二、一些共性认知        在进一步深入讨论之前,先以提问的方式就一些共性认知达成一致。        提问:工作线程数是不是设置的越大越好?        回答:肯定不是的        1)一来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个工作线程没有意义        2)线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部