Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有执行器的线程池POC(概念验证)_Java_Multithreading_Threadpool_Executors - Fatal编程技术网

Java 具有执行器的线程池POC(概念验证)

Java 具有执行器的线程池POC(概念验证),java,multithreading,threadpool,executors,Java,Multithreading,Threadpool,Executors,有人能举例说明为什么我们应该使用线程池吗 我从理论上了解了执行器线程池的使用 我已经阅读了很多教程,但是我没有得到任何关于为什么要使用线程池的实际例子,可以是newFixedThreadPool或newCachedThreadPool或newSingleThreadExecutor 在可伸缩性和性能方面 如果有人向我解释性能和可伸缩性,并举例说明的话?我会从一个问题开始,然后尝试找到解决方案 如果你以你现有的方式开始,你可以找到一个解决问题的方法,你很可能会不恰当地使用它 如果您想不出线程池的用

有人能举例说明为什么我们应该使用线程池吗

我从理论上了解了执行器线程池的使用

我已经阅读了很多教程,但是我没有得到任何关于为什么要使用线程池的实际例子,可以是newFixedThreadPool或newCachedThreadPool或newSingleThreadExecutor

在可伸缩性和性能方面


如果有人向我解释性能和可伸缩性,并举例说明的话?

我会从一个问题开始,然后尝试找到解决方案

如果你以你现有的方式开始,你可以找到一个解决问题的方法,你很可能会不恰当地使用它

如果您想不出线程池的用途,请不要使用它们。;)

人们常犯的一个错误是,因为他们现在有很多CPU,所以他们不得不使用它们,就好像这本身就是一个原因。这就像说我有很多磁盘空间,我必须找到一种方法来使用所有的磁盘空间

使用线程池的一个很好的理由是提高CPU边界进程的性能和IO边界进程的简单性(而不是使用一个线程的非阻塞IO)

如果您有一个繁忙的CPU绑定进程,该进程执行可以独立执行的任务,那么线程池就有了一个很好的用例

注意:线程池通常只有一个线程。这些都有特定的静态工厂。如果您想要一个简单的后台工作人员,这可能是一个选项

注2:一个常见的错误是假设CPU限制的任务在数百或数千个线程上运行得最好。线程的最佳数量可以是您拥有的核心或CPU的数量。一旦所有这些都很忙,您可能会发现额外的线程只会增加开销。

我在谷歌上搜索了“为什么使用java线程池”,发现:

线程池提供了一个解决线程问题的解决方案 生命周期开销和资源波动问题

newCachedThreadPool方法使用可扩展的 线程池。此执行器适用于启动的应用程序 许多短期任务。 newSingleThreadExecutor方法创建一个 一次执行一个任务的执行者

初始化新线程(及其自身堆栈)是一项代价高昂的操作

线程池通过重用已经创建的线程来避免这种开销。因此,使用线程池可以获得比每次创建新线程更好的性能

还要注意的是,创建的线程可能需要在使用后被“删除”,这会增加垃圾收集的成本和发生的频率(因为内存填充速度更快)


此分析仅从性能的角度进行。就可伸缩性而言,目前我想不出使用线程池有什么好处。

首先,检查一下我昨天写的关于线程池的描述:(好的,是关于android的,但对于经典java也是如此)

我经常发现使用线程池的主要用途是很好地管理一个非常常见的问题:生产者-消费者。在这种模式中,需要有人不断地发送工作项(生产者)以供其他人(消费者)处理。工作项是从一些类似流的源(如套接字、数据库或磁盘文件的集合)获取的,需要多个工作项才能有效地处理。此处可识别的主要组件包括:

  • 制作人:一条不断发布工作的线索
  • 发布作业的队列
  • 使用者:从队列中获取作业并执行它们的工作线程
除此之外,还需要采用同步以使所有这些工作正常进行,因为在没有同步的情况下读取和写入队列可能会导致数据损坏和不一致。此外,我们需要使系统高效,因为消费者不应该在无事可做时浪费CPU周期

现在这种模式非常常见,但要从头开始实现它需要付出相当大的努力,这很容易出错,需要仔细检查

解决方案是线程池。它非常方便地管理工作队列、使用者线程和所有需要的同步。您所需要做的就是扮演制作人的角色,并向池中提供任务