【问题标题】:Multithreading server: one thread per client connection多线程服务器:每个客户端连接一个线程
【发布时间】:2015-03-24 17:35:24
【问题描述】:

我有多线程 Java 应用程序。我想知道这种方法是否正确。从我的主要方法中,我将启动两个线程。一个线程开始监听即将到来的客户端连接(这是一个客户端-服务器应用程序)。一旦客户端与服务器连接,它就会启动一个新线程来处理客户端,并且对于所有客户端连接都将继续。由主程序启动的另一个线程处理客户端收到的消息,这些消息在一个公共缓冲区中。

我的问题是: 主线程启动一个线程(服务器),该线程又启动许多线程。这是正确的吗?

【问题讨论】:

  • 请始终包含您自己代码的相关部分。
  • 为每个新连接启动一个线程适用于少量连接,但扩展性很差。我建议你尝试使用 ThreadPool 来处理打开的连接,这样效率会更高。

标签: java multithreading


【解决方案1】:

有问题。可以在您的服务器上同时创建许多线程并且您面临 DOS(拒绝服务)。 我建议使用 java.util.concurrent.ExecutorService 实现。

例如:

Runnable yourRunnable;
ExecutorService executorService = Executors.newFixedThreadPool(50);
executorService.submit(yourRunnable);

【讨论】:

    【解决方案2】:

    是的,主线程可以启动其他线程。如果父线程退出没有问题,子线程就会运行。请使用主线程接受新的连接和其他线程处理客户端请求,然后处理客户端线程应该维护自己的输入输出流。

    【讨论】:

      【解决方案3】:

      你在这里使用了某种错误的方法......

      主程序启动的另一个线程处理消息 由位于公共缓冲区中的客户端接收。

      为什么要为所有客户端使用公共缓冲区?它是线程安全的。

      更好的方法:

      处理客户端的线程也应该处理自己的缓冲区。因此,当任何客户端连接时创建新线程并为每个客户端创建新的读写缓冲区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 2011-04-28
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        相关资源
        最近更新 更多