每个连接线程模型

时间:2013-03-28 17:25:37

标签: java multithreading sockets io blocking

谈到每个连接的线程模型,每个连接应该有一个单独的线程。该线程用于从流中读取数据。但是,由于我正在使用阻止I / O ,因此在尝试阅读时无法发送任何内容。

显然,Minecraft每个连接使用两个线程,一个用于读取,一个用于写入。这是我应该做的事情,或者我应该如何实施呢?

据我所知,发送数据也会阻塞,所以我不能只是从tick线程发送它,对吗?

再一次,我想知道的是:

  • 我应该为每个连接都有一个读写线程吗?如果没有,我该如何实现呢?

提前致谢。

1 个答案:

答案 0 :(得分:1)

在一个简单的乒乓式网络对话框中,运行某种状态机的单个线程就足够了。

但是,如果需要异步发送和/或接收数据而不是直接响应接收或发送的最后一个数据,则每个方向的一个线程是明智的并且不是一个坏的解决方案无论如何。

由Java NIO提供的非阻塞IO对于高性能,高吞吐量的应用程序(如负载很重的Web服务器等)是有利的。在这些应用程序中,不希望有一个或两个线程每个连接,可能在服务器上并发运行数千个线程。在客户端,使用非阻塞IO不会带来太大的好处,如果您不希望同时维护数百个连接,那么多线程是可行的。