具有执行程序的ThreadPools的POC(概念证明)

时间:2012-03-15 10:30:15

标签: java multithreading threadpool executors

任何人都可以解释为什么我们应该使用线程池。

我从理论上知道如何使用线程池和Executors。

我已经完成了许多教程,但是我没有得到任何关于我们为什么要使用Threadpools的实例,它可以是newFixedThreadPool或newCachedThreadPool或newSingleThreadExecutor

在可扩展性和性能方面。

如果有人通过实例解释我的性能和可扩展性吗?

4 个答案:

答案 0 :(得分:2)

首先,检查我昨天写的线程池的描述:Android Thread Pool to manage multiple bluetooth handeling threads?(好吧,它是关于android的,但它对于经典java来说是一样的。)

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

  • 生产者:一个不断发布职位的线程
  • 发布作业的队列
  • 使用者:从队列中获取作业并执行它们的工作线程

除此之外,还需要采用同步来使所有这些工作正常,因为在没有同步的情况下读取和写入队列可能会导致数据损坏和不一致。此外,我们需要使系统高效,因为消费者不应该在没有任何事情时浪费CPU周期。

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

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

答案 1 :(得分:1)

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

如果你按照自己的方式开始,你可以找到一个解决问题的解决方案,你很可能会不恰当地使用它。

如果您无法想到线程池的用法,请不要使用它们。 ;)

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

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

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

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

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

答案 2 :(得分:1)

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

线程池用于通过重用已创建的线程来避免此成本。因此,使用线程池可以获得更好的性能,然后每次都创建新线程。

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

此分析仅从性能的角度出发。我无法想到目前在可扩展性方面使用线程池的优势。

答案 3 :(得分:-1)

我用Google搜索“为什么要使用java线程池”并找到:

  

线程池提供了解决线程问题的方法   生命周期开销和资源颠簸问题。

http://www.ibm.com/developerworks/library/j-jtp0730/index.html

  

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

http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html