Java中的信号量和线程池

x759pob2  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(236)

我对Java中信号量的概念不是很清楚,并试图理解它。
我在阅读oracle文档(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html)和其他一些页面后的理解是,它类似于一个具有许可证数量计数的锁。
它通常被用来创建资源池。这里我感到困惑,还有ThreadPoolExecutor可以给予我一个线程池。那么有什么区别呢?哪一个在什么场景中使用?

tag5nh1u

tag5nh1u1#

首先,没有愚蠢的问题...
Semaphore允许多个线程“获取”一个资源。它们应该检查该资源是否可用。它就像一个流量控制阀。
Lock用于独占访问。一次只能访问一个线程。
ThreadPoolExecutor允许您使用有限数量的线程来运行一些代码(Runnable或Callable类)。您不必费心自己构建它,它已经在JSE API中实现了。您可以使用一些信号量和队列来完成自己的任务...但是如果您没有足够的理由,请不要浪费时间。
假设您必须实现一个Web服务器,它接收到一些到端口80的请求。您不希望使用监听此端口的同一个线程来处理整个请求(这是资源的浪费...)。您可以使用ThreadPoolExecutor处理请求,处理它,并响应客户端。ThreadPoolExecutor可以配置为利用当前的CPU:该体系结构和该任务的最佳线程数。
Concurrency in practice是一本很好的书,可以提高你对这件事的了解。
我希望这对你有帮助,对我的基本英语感到抱歉。

yeotifhr

yeotifhr2#

ThreadPool是一个由一个或多个线程组成的池,可以集中管理。在Java中,ThreadPoolExecutor也有一个队列,当你给予它Runnable或Callable来执行时,它可以返回一个Future,允许你控制任务或获得一个结果。
一个信号量只允许你获得一些许可,例如,它最多允许两个线程运行一些代码。你需要运行一些线程来给予它一个目的,但除此之外它们是无关的。
顺便说一句:我会阅读Java7的文档,因为Java5.0已经停产一段时间了,Java6几乎是免费服务的终结。

相关问题