Java NIO Http客户端请求线程池

时间:2013-05-16 06:59:14

标签: java multithreading threadpool nio threadpoolexecutor

线程池执行程序使用Future Task的线程数。 它会分配至少一个线程,直到run()或call()返回。

因此,我对如何使用线程池进行JAVA NIO HTTP请求感到困惑。

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

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

我的问题是如何使用基于Java NIO的HTTP POST客户端请求和线程池(由于我们需要进行大量的HTTP请求),或者使用Java NIO,实际上不需要在多个线程上运行它们,因为线程永远不会睡觉(它总是执行,因为没有什么可以阻止)

1 个答案:

答案 0 :(得分:2)

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

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

将任务提交给线程池。

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

NIO1需要一个选择器线程。单独创建并运行线程池。 NIO2(java7)不需要选择器线程(它在后台维护它,以便用户不要打扰)。

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