Java 具有执行器的线程池POC(概念验证)
有人能举例说明为什么我们应该使用线程池吗 我从理论上了解了执行器线程池的使用 我已经阅读了很多教程,但是我没有得到任何关于为什么要使用线程池的实际例子,可以是newFixedThreadPool或newCachedThreadPool或newSingleThreadExecutor 在可伸缩性和性能方面Java 具有执行器的线程池POC(概念验证),java,multithreading,threadpool,executors,Java,Multithreading,Threadpool,Executors,有人能举例说明为什么我们应该使用线程池吗 我从理论上了解了执行器线程池的使用 我已经阅读了很多教程,但是我没有得到任何关于为什么要使用线程池的实际例子,可以是newFixedThreadPool或newCachedThreadPool或newSingleThreadExecutor 在可伸缩性和性能方面 如果有人向我解释性能和可伸缩性,并举例说明的话?我会从一个问题开始,然后尝试找到解决方案 如果你以你现有的方式开始,你可以找到一个解决问题的方法,你很可能会不恰当地使用它 如果您想不出线程池的用
如果有人向我解释性能和可伸缩性,并举例说明的话?我会从一个问题开始,然后尝试找到解决方案 如果你以你现有的方式开始,你可以找到一个解决问题的方法,你很可能会不恰当地使用它 如果您想不出线程池的用途,请不要使用它们。;) 人们常犯的一个错误是,因为他们现在有很多CPU,所以他们不得不使用它们,就好像这本身就是一个原因。这就像说我有很多磁盘空间,我必须找到一种方法来使用所有的磁盘空间 使用线程池的一个很好的理由是提高CPU边界进程的性能和IO边界进程的简单性(而不是使用一个线程的非阻塞IO) 如果您有一个繁忙的CPU绑定进程,该进程执行可以独立执行的任务,那么线程池就有了一个很好的用例 注意:线程池通常只有一个线程。这些都有特定的静态工厂。如果您想要一个简单的后台工作人员,这可能是一个选项 注2:一个常见的错误是假设CPU限制的任务在数百或数千个线程上运行得最好。线程的最佳数量可以是您拥有的核心或CPU的数量。一旦所有这些都很忙,您可能会发现额外的线程只会增加开销。我在谷歌上搜索了“为什么使用java线程池”,发现: 线程池提供了一个解决线程问题的解决方案 生命周期开销和资源波动问题 及 newCachedThreadPool方法使用可扩展的 线程池。此执行器适用于启动的应用程序 许多短期任务。 newSingleThreadExecutor方法创建一个 一次执行一个任务的执行者 初始化新线程(及其自身堆栈)是一项代价高昂的操作 线程池通过重用已经创建的线程来避免这种开销。因此,使用线程池可以获得比每次创建新线程更好的性能 还要注意的是,创建的线程可能需要在使用后被“删除”,这会增加垃圾收集的成本和发生的频率(因为内存填充速度更快)
此分析仅从性能的角度进行。就可伸缩性而言,目前我想不出使用线程池有什么好处。首先,检查一下我昨天写的关于线程池的描述:(好的,是关于android的,但对于经典java也是如此) 我经常发现使用线程池的主要用途是很好地管理一个非常常见的问题:生产者-消费者。在这种模式中,需要有人不断地发送工作项(生产者)以供其他人(消费者)处理。工作项是从一些类似流的源(如套接字、数据库或磁盘文件的集合)获取的,需要多个工作项才能有效地处理。此处可识别的主要组件包括:
- 制作人:一条不断发布工作的线索
- 发布作业的队列
- 使用者:从队列中获取作业并执行它们的工作线程