【问题标题】:Java NIO Http client requests with thread pools带有线程池的 Java NIO Http 客户端请求
【发布时间】:2013-05-10 23:04:29
【问题描述】:

线程池执行器使用未来任务的线程数。 它至少分配一个线程,直到 run() 或 call() 返回。

所以,我对如何使用线程池处理 JAVA NIO HTTP 请求感到困惑。

1) 哪个线程将运行事件循环

2) 由于线程不会阻塞 IO,它们将退出 run/call 方法。 然后谁负责调用他们的处理程序。

我的问题是如何将基于 Java NIO 的 HTTP POST 客户端请求与线程池一起使用(因为我们需要发出大量的 HTTP 请求),或者使用 Java NIO,实际上不需要在多个线程上运行它们,因为线程永远不会休眠(它总是执行,因为没有什么可以阻塞)

【问题讨论】:

    标签: java multithreading threadpool nio threadpoolexecutor


    【解决方案1】:

    好的,这就是哲学。多线程可以用于 2 种风格(可能更多,但在这种情况下并不重要)。传统的多线程使用线程和阻塞 I/O。任务粒度多线程(请提出更好的术语)建立在传统多线程之上,并利用以下限制:

    • Runnable 类型的任务是一个工作单元;
    • 任务不能阻塞;
    • 如果一个任务想要等待一个长事件(例如 I/O 或时间间隔的完成),它会准备另一个任务并安排它在事件之后运行,然后退出(从 Runnable.run() 返回)。

    任务被提交到线程池执行。

    异步 ​​I/O 非常适合面向任务的模型。期货是面向线程和面向任务的编程风格之间的粘合剂。它们可用于将信息从任务传递到线程,但不能反向传递,因为任务可能不会阻塞。所以在设计完全异步的服务器时,你根本不需要使用 Futures。

    NIO1 需要一个选择器线程。与线程池分开创建和运行它。 NIO2 (java7) 不需要选择器线程(它在后台维护它,这样用户就不会打扰)。

    很容易找到 NIO 服务器的示例。 df4j 有用于 NIO1 和 NIO2 的 echo-servers(但不是 http 服务器)的示例。

    【讨论】:

    • 我无法在github.com/rfqu/df4j/tree/master/df4j-nio2/src 找到线程池的使用情况,如果你也能给出一些具体的例子,这真的很有帮助。
    • df4j-nio2 不是一个单独的项目。查看 df4j-nio,它是一个基础,根据您要使用的实现,应在类路径中添加 df4j-nio2 或 df4j-nio1。 df4j 中不直接使用线程池,它会在需要时自动创建,并作为线程局部变量保存。它可以通过 com.github.rfqu.df4j.core.DFContext.getCurrentExecutorService() 访问。阅读 Readme.md github.com/rfqu/df4j
    • 谢谢 :) 如果没有更多回复,可以标记为答案。
    猜你喜欢
    • 2019-01-20
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2018-05-04
    • 2013-01-18
    相关资源
    最近更新 更多