2013-01-22 221 views
5

我对Java中信号量的概念并不十分清楚,并试图理解它。Java中的信号量和线程池

我的理解是在阅读oracle docs(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html)和其他一些页面之后,其类似于a锁定许可证数量。

它通常用于创建资源池。 在这里我感到困惑,也有ThreadPoolExecutor,它可以给我一个线程池。那么区别是什么呢?在哪种情况下使用哪一个?

回答

1

ThreadPool是一个可以共同管理的多个线程池中的一个。在Java中ThreadPoolExecutor在为Runnable或Callable执行时也有一个队列,它可以返回一个Future,它允许您控制任务或获取结果。

信号量只允许你获得许多许可证,例如它最多可以允许两个线程运行一些代码。你需要运行一些线程才能达到目的,否则它们是不相关的。

顺便说一句:我会阅读Java 7的文档,因为Java 5.0已经停用了一段时间,Java 6几乎在免费服务结束。

+0

感谢您指出Java 7文档。我刚刚搜索并打开链接。 – mehta

+0

谷歌是有点过时的链接。它经常给你1.4.2。 –

+1

谷歌搜索:“Java 7 XXX”与XXX =该类的名称99%的时间工作。例如:[搜索Java 7 Semaphore](https://www.google.co.uk/search?q=java+7+semaphore)。 – assylias

4

首先,有没有这样的事情愚蠢的问题...

Semaphore允许多个线程“获取”的资源。他们应该检查资源是否可用。它就像一个流量控制阀。

A Lock是为独家访问。一次只有一个线程。

A ThreadPoolExecutor允许您使用有限的线程数运行一些代码(Runnable或Callable类)。您不必费心自己构建它,它已经在JSE API中为您实施。你可以用一些信号量和队列来做你自己的事情......但是如果你没有很好的理由,不要浪费你的时间。

想象你必须实现一个Web服务器,它接收到一些端口80的请求。你不想用同一个线程来监听这个端口来处理整个请求(这是浪费资源......) 。您可以使用ThreadPoolExecutor处理请求,处理它并响应客户端。 ThreadPoolExecutor可以配置为利用当前的CPU:针对此架构和此任务的最佳威胁数量。

Concurrency in practice是一本不错的书,可以提高您对此事的认识。

我希望这可以帮助你,并对我的基础英语感到抱歉。