在程序开发中,为了提高性能,我们经常会使用多线程进行开发,而对于多线程,我们往往会使用线程池来处理。线程池可以带来很多好处。有兴趣的可以看看千火君之前写的文章:ThreadPoolThreadPool看这篇文章就够了。现在有一个问题。在应用中,对于多线程开发,我们应该如何设置线程数才最合理呢?是不是更合理?越多越好?当然不是。在多线程中,必须提到上下文切换。首先,在单核CPU中,上下文切换也可以处理多线程,只不过CPU是通过给每个线程分配CPU时间片来处理的。假设我们有两个线程A和B来执行任务。CPU在很短的时间内(时间片)执行A线程,然后执行B线程。分片之间的间隔很短,让我们感觉是同时执行的,也就是多线程,这种切换就叫上下文切换。从上面的描述我们可以知道,上下文切换必然会导致之前的状态保持和启动,这必然会导致性能损失,所以多线程的数量不一定很快,也就是说线程的数量不是越好。.那么如何合理设置线程数呢?多线程任务分类对于多线程通常分为两类场景:IO密集型:IO密集型通常是指程序运行的耗时段,大部分时间用于I/O操作,而此时线程不会占用CPU进行处理。CPU密集型:CPU密集型通常是指系统在运行过程中会消耗大量的CPU资源,比如需要进行大量的计算,一些复杂的运算,逻辑处理等。因此,不同场景的线程数是不同的。I/O密集型系统多是在进行I/O交互,暂时不会占用CPU资源。因此,可以增加线程数。对于线程数,可以使用以下计算公式:最佳线程数=((线程等待时间+线程CPU时间)/线程CPU时间)*CPU核数,假设没有等待线程,则最优线程数=1*CPU核心数,但实际上线程一般是有等待时间的。保守的认为等待时间与线程的CPU时间相同,即2*CPU核数,所以一般设置为最佳线程数=CPU核数*2CPU-密集的。对于CPU密集型来说,大部分都是使用cpu资源进行计算,所以一般这样的场景,最佳线程数设置为CPU核心线程数+1,以充分利用多核CPU的处理能力.最佳线程数=CPU核心数+1java获取cpu核心数的方法如下:Runtime.getRuntime().availableProcessors()
