java是什么 java多线程ExecutorService线程数量?
java多线程ExecutorService线程数量?
新增了一个Executors工厂类产生线程池,如下面几个方法
- public static ExecutorService newFixedThreadPool(int nThreads)
- public static ExecutorService newSingleThreadExecutor()这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法:
- Future<?> submit(Runnable task)
- <T> Future<T> submit(Callable<T> task)
大家如何估算线程池数量?
线程池的大小对系统的性能有一定的影响,过大或者过小的线程数量都无法发挥最优的系统性能,但是线程池大小的确定也不需要做的非常精确。因为只要避免极大和极小两种情况,线程池的大小对性能的影响都不会影响太大,一般来说,确定线程池的大小需要考虑CPU数量,内存大小等因素,在《Java Concurrency in Practice》 书中给出了一个估算线程池大小的经验公式:
公式:Nthread = Ncpu * Ucpu * (1 W/C),各字段含义:
Nthreads:线程数量
Ncpu:CPU的数量,Runtime.getRuntime().availableProcessors()
Ucpu:CPU使用率,范围在[0,1]
W/C:等待时间与计算时间的比率
其实就是要分清是计算密集型还是IO密集型。
如果是C无限大也就是计算密集型的那么线程太多意义不大,因为需要CPU计算,起多了也没用。
如果是IO密集型那么可以起更多的线程,因为等待时间过多。
简单总结就是:IO密集多线程,计算密集线程=CPU核数比较合适。
欢迎关注笔者,持续分享有价值的优质架构文章。
java什么是线程池及为什么要使用线程池?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。