`
terrencexu
  • 浏览: 122519 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浅谈线程池

    博客分类:
  • Java
阅读更多

“什么是线程池?”

“呃……”

 

“为什么要使用线程池?”

“呃……”

 

“什么情况下使用线程池?”

“呃……”

 

这三个问题,说好回答挺容易,说难回答挺难。

 

“什么是线程池?”

“一组创建好的线程。”

 

“为什么要使用线程池?”

“提高CPU吞吐量,提升系统性能。”

 

“什么情况下使用线程池?”

“同时有多个请求或者多个任务需要处理,并且请求和任务会有block。”

 

当初这三个问题,问前辈的时候,前辈是这样告诉我的,没太听懂,感觉特牛逼,特玄乎,然后就不懂装懂了好长一段时间,后来想了想,这三个问题,前辈回答的还是不错的。

 

假设系统有1个CPU

 

假设你有两个Task需要处理,如果单线程处理,task2需要等待task1结束之后才能开始处理,如果task1有50%的时间处于block状态,那CPU就有50%的空闲时间被浪费掉了。

 

假设你有两个Task需要处理,如果有两个线程,当task1被block的时候,task2就可以独占CPU,这样就可以提高两个task的执行效率。

 

这样的话,如果再来一个任务,我们就再创建一个新的线程,去处理新来的任务,总之看上去好像是线程越多,CPU的利用率就越高,好像会处理的越来越快的样子。

 

但是事情恰恰相反,当线程数到达某个数值之后,你会发现,随着新线程的加入,系统对单一任务的响应时间越来越长,越来越慢,而且如果再继续增多的话,貌似内存要溢出了~而且响应时间也变成了无限长,直到任何一个任务都无法被完成。

 

那此时我们可能就会抛出一个解决方案:设定一个thread数的最大值不就好了,对,很对,问题得到了很好的解决,当有一个新的任务到来之后,我们就创建一个新的线程去处理它,直到活跃的线程数达到最大值之后,如果再有新的任务到来,那就让它排队等待好了,等之前的某个线程处理结束之后,再创建一个新的线程来处理排队的task,嗯,看上去已经完美了。

 

但是有一个问题被忽视了,创建和销毁线程是需要代价的!创建一个新的线程的时间大概需要消耗系统几百毫秒的时间,看着挺短,呃,其实挺长的~另外还需要消耗内存等其他资源,总之就是反复的创建和销毁线程是不好的,这个时候我们就又想出了一个解决方案:如果我们创建好固定数量的线程,不去销毁它,而是来了任务之后反复的利用,没有任务的时候就休息着先,而不是让它挂掉,这样问题不就解决了吗,嗯,很好,于是线程池就产生了,这就是线程池,上面的步骤也解释了为什么要使用线程池,和什么时候使用线程池。

 

Mark...

3
1
分享到:
评论

相关推荐

    浅谈线程池.pdf

    本文主要探讨了Java中的线程池,包括为何要使用线程池、线程池的原理、如何优化线程池参数以及线程池与Go语言中的协程(goroutine)的对比。 ### 为什么使用线程池 1. **系统资源消耗**:线程是操作系统中的基本...

    浅谈python 线程池threadpool之实现

    ### 浅谈Python线程池ThreadPool之实现 在并发编程领域,线程池技术是一种非常高效的方法,可以显著提升程序的执行效率。Python中的`threadpool`库为开发者提供了便捷的方式来管理和利用线程池。本文将详细介绍...

    浅谈Spring @Async异步线程池用法总结

    浅谈Spring @Async异步线程池用法总结 本文主要介绍了Spring @Async异步线程池的用法总结,包括异步线程池的接口类、@Async定义异步任务、Spring开启异步配置等内容。 1. 异步线程池的接口类 Spring提供了多种...

    浅谈Android中线程池的管理

    在Android开发中,线程池的管理是一项重要的任务,尤其是在处理异步任务和优化性能时。本文将深入探讨Android中的线程池管理,以及与之相关的线程机制,如Handler、Looper和MessageQueue。 首先,我们来了解下...

    浅谈java常用的几种线程池比较

    Java线程池是一种高效管理线程的工具,它允许开发者预先配置一定数量的线程,以处理并发任务,而不是每次需要处理任务时才创建新线程。线程池的使用可以减少线程创建和销毁的开销,提高系统资源利用率,并能够通过...

    浅谈Android 的线程和线程池的使用

    在Android开发中,线程和线程池的管理对于应用性能和用户体验至关重要。本文将深入探讨Android中的线程和线程池的使用,包括主线程、子线程、AsyncTask、HandlerThread以及IntentService。 首先,主线程在Android中...

    浅谈java.util.concurrent包中的线程池和消息队列

    "java.util.concurrent包中的线程池和消息队列" java.util.concurrent包中的线程池和消息队列是一种高效的多线程编程技术,主要用于解决处理器单元内多个线程执行的问题。线程池技术可以显著减少处理器单元的闲置...

    浅谈tomcat一些细节配置

    【标题】:“浅谈Tomcat一些细节配置” Tomcat,作为Apache软件基金会的开源项目,是Java Servlet和JavaServer Pages(JSP)的容器,也是Java EE Web应用程序的标准实现。在实际开发和部署中,对Tomcat进行适当的...

    浅谈C#网络编程详解篇

    在C#中,可以利用Task或者async/await关键字实现异步处理,避免线程池过度膨胀: ```csharp async Task HandleClient(Socket clientSocket) { byte[] receiveBuffer = new byte[100]; await clientSocket....

    浅谈linux多线程编程和windows多线程编程的异同.doc

    在 Windows 中,线程间通信还有其他高级特性,如线程同步对象(事件、信号量、临界区等),以及线程池等。线程池允许预先创建一组线程,待有任务时分配给它们执行,提高了效率。而在 Linux 中,虽然没有内置的线程池...

    浅谈Spring中的Quartz配置

    `configLocation`属性指向Quartz的配置文件,可以设置数据库连接、线程池大小等参数。`autoStartup`属性控制调度器是否在Spring启动时自动运行。 接着,我们需要定义JobDetail Bean,这代表我们要执行的任务。例如...

    浅谈分布式任务注册及调度的实现方法.pdf

    任务执行控制器由分发线程和执行线程池组成,分发线程根据“执行策略”来控制任务的执行方式,而执行线程池负责具体执行任务。 总的来说,分布式任务注册及调度系统的实现对于现代企业信息系统的高效运作至关重要。...

    浅谈JAVA中多线程的实现.zip

    ExecutorService可以创建线程池,从而更有效地管理线程资源。通过submit()方法提交Runnable或Callable任务,获取Future对象,可以用来查询任务状态或获取结果。 ```java ExecutorService executor = Executors....

    浅谈spring 线程异步执行

    主要介绍了浅谈spring 线程异步执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    浅谈.Net下的多线程和并行计算(全集)

    此外,还有线程池(ThreadPool)提供线程复用,可以更高效地管理和调度线程资源。 多线程带来的好处是能够实现并发执行,例如在一个线程处理IO操作的同时,另一个线程可以进行计算。然而,多线程也带来了挑战,如...

    Spring Boot浅谈(是什么/能干什么/优点和不足).docx

    - **性能优化**:合理配置Actuator的监控点,及时调整系统性能,如内存、线程池等。 - **安全性考量**:除了基本的身份验证,还需考虑数据加密、API权限控制等安全措施。 - **测试策略**:充分运用Mock和自动化...

    浅谈Spring Boot 整合ActiveMQ的过程

    浅谈Spring Boot 整合ActiveMQ的过程 Spring Boot 是一种流行的Java框架,用于快速构建基于Spring的应用程序。ActiveMQ是一个流行的开源消息队列系统,用于在分布式系统中实现消息传递。本文将介绍如何在Spring ...

Global site tag (gtag.js) - Google Analytics