9

我对 Java 中信号量的概念并试图理解它不是很清楚。

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

它通常用于创建资源池。在这里我很困惑,还有 ThreadPoolExecutor 可以给我一个线程池。那么区别是什么呢?哪一个用在什么场景下?

4

2 回答 2

11

首先,没有愚蠢的问题......

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

用于独占访问。一次只有一个线程。

ThreadPoolExecutor允许您使用有限数量的线程运行一些代码(Runnable 或 Callable 类)。您不必费心自己构建它,它已经在 J​​SE API 中为您实现了。你可以自己做一些信号量和队列......但如果你没有充分的理由,不要浪费你的时间。

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

实践中的并发是一本很好的书,可以提高您在这方面的知识。

我希望这对您有所帮助,并对我的基本英语感到抱歉。

于 2013-01-22T10:59:11.933 回答
1

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

信号量只允许您获得一些许可,例如它最多允许两个线程运行一些代码。您需要运行许多线程来赋予它一个目的,否则它们是不相关的。

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

于 2013-01-22T10:31:57.637 回答