0

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

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

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

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

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

4

1 回答 1

2

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

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

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

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

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

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

于 2013-05-16T07:34:33.383 回答