线程池执行程序使用Future Task的线程数。 它会分配至少一个线程,直到run()或call()返回。
因此,我对如何使用线程池进行JAVA NIO HTTP请求感到困惑。
1)哪个线程将运行事件循环
2)由于线程不会阻塞IO,它们将退出run / call方法。 然后谁负责调用他们的处理程序。
我的问题是如何使用基于Java NIO的HTTP POST客户端请求和线程池(由于我们需要进行大量的HTTP请求),或者使用Java NIO,实际上不需要在多个线程上运行它们,因为线程永远不会睡觉(它总是执行,因为没有什么可以阻止)
答案 0 :(得分:2)
好的,这就是哲学。多线程可以使用2种口味(可能更多,但在这种情况下并不重要)。传统的多线程使用线程和阻塞I / O.任务粒度多线程(请建议更好的术语)建立在传统的多线程之上,并遵循以下限制:
Runnable
的任务是一个工作单元; Runnable.run()
返回)。 / LI>
将任务提交给线程池。
异步I / O非常适合面向任务的模型。期货是面向线程和面向任务的编程风格之间的粘合剂。它们可用于将信息从任务传递到线程,但不能反向传递,因为任务可能不会阻塞。因此,在设计完全异步服务器时,您根本不需要使用Futures。
NIO1需要一个选择器线程。单独创建并运行线程池。 NIO2(java7)不需要选择器线程(它在后台维护它,以便用户不要打扰)。
很容易找到NIO服务器的示例。 df4j包含NIO1和NIO2的echo-servers(但不是http服务器)的示例。