我对Java中的信号量概念并不十分清楚并试图理解它。
我在阅读oracle docs(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html)和其他一些页面之后的理解,它类似于一个锁有许可证数量。
它通常用于创建资源池。 在这里我感到困惑,还有ThreadPoolExecutor可以给我一个线程池。那么区别是什么呢?在哪种情况下使用哪一个?
答案 0 :(得分:6)
首先,没有愚蠢的问题......
Semaphore允许多个线程“获取”资源。他们应该检查资源是否可用。它就像一个用于流量控制的阀门。
Lock用于独占访问。一次只有一个线程。
ThreadPoolExecutor允许您使用有限数量的线程运行一些代码(Runnable或Callable类)。您不必费心自己构建它,它已经在JSE API中为您实现。你可以使用一些信号量和队列自己做...但如果你没有充分的理由不要浪费你的时间。
映像您必须实现一个接收端口80请求的Web服务器。您不希望使用正在侦听此端口的同一线程来处理整个请求(这会浪费资源......)。您可以使用ThreadPoolExecutor处理请求,处理它并响应客户端。 ThreadPoolExecutor可以配置为利用当前的CPU:此架构和此任务的最佳威胁数。
Concurrency in practice是一本很好的书,可以提高你对此事的认识。
我希望这可以帮到你,对不起我的基本英语。
答案 1 :(得分:1)
ThreadPool是一个可以集体管理的一个或多个线程的池。在Java中,ThreadPoolExecutor也有一个队列,当你给它Runnable或Callable执行时,它可以返回一个Future,它允许你控制任务或获得结果。
信号量只允许您获得许多许可证,例如它最多允许两个线程运行一些代码。你需要运行一些线程来实现它的目的,否则它们是无关的。
BTW:我会阅读Java 7的文档,因为Java 5.0已经有一段时间了,而且Java 6几乎处于免费服务终端。