java - Java 中的信号量和线程池

标签 java concurrency

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

我看了oracle docs(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html)和其他一些页面后的理解,它类似于锁计算许可数量。

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

最佳答案

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

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

A Lock用于独家访问。一次只有一个线程。

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

假设您必须实现一个 Web 服务器,该服务器接收到端口 80 的一些请求。您不想使用正在监听此端口的同一个线程来处理整个请求(这是资源浪费...) .您可以使用 ThreadPoolExecutor 处理请求、处理请求并响应客户端。 ThreadPoolExecutor 可以配置为利用当前 CPU:此体系结构和此任务的最佳线程数。

Concurrency in practice是一本很好的书,可以提高您在这方面的知识。

我希望这对你有帮助,抱歉我的英语很基础。

关于java - Java 中的信号量和线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456276/

相关文章:

java - RCP 应用程序找不到新添加的 View

java - 使用 TestNG 的页面对象模式

java - 使用cxf从wsdl生成java代码给出代码太大错误

java - 处理 ThreadPoolExecutor 的异常

java - 并发使用作为 RMI 服务公开的 EJB

java - 将多个测试运行合并到一个 Jacoco.exec 文件中

java - 并发和并发数据结构

concurrency - 将 Post 或 PostAndAsyncReply 与 F# 的 MailboxProcessor 一起使用?

java - 是否应该为每个线程创建一个新对象?

java - 为什么/何时调用 ComponentListener.componentShown()?