【问题标题】:How to wait client in multi-threading如何在多线程中等待客户端
【发布时间】:2017-02-25 23:53:29
【问题描述】:

我有 TCP 客户端/服务器。客户端正在运行两个线程 C1 和 C2。并且服务器正在运行三个线程 S1、S2 和 S3 线程。 C2 应该在服务器完成 S3 后收到结果。我在最后一步有问题。客户端和服务器看起来像这样。请提出建议。

Public class client {
    public static void main (String[] args)
    {
    ClientThread c1= new ClientThread(); // send task to server
    ClientThread c2= new ClientThread(); // result receive
    c1.start();
    c1.join();
    c2.start();
    c2.join();
    }
    }

服务器如下所示:

Public class server {
    public static void main (String[] args)
    {
    ServerThread s1= new ServerThread(); // receive from client
    ServerThread s2= new serverThread(); // calculate
    ServerThread s3= new serverThread(); // send to client
    s1.start();
    s1.join();
    s2.start();
    s2.join();
    s3.start();
    s3.join();
    }
    }

输出的顺序应该是这样的:

c1 sends task
s1 receives task
s2 calculates
s3 sends result to client
c2 receives final result

【问题讨论】:

  • 为什么?所有服务器线程都按顺序运行,因此它们根本不需要是线程。您的问题是您有 start/join/start/join,这没有任何意义: start 后跟 join 根本不是多线程,它是顺序执行。它应该是开始/开始/加入/加入。
  • 我在服务器和客户端都像开始/开始/加入/加入一样发生​​了变化。然而,C2 仍然在 S3 之前开始(即在套接字上读取)(即在套接字中写入结果)。如何保证S3写完结果后C2才开始接收结果?

标签: java multithreading sockets java-threads


【解决方案1】:

s1.join 可能会等待,因此 s2 可能不会启动,或者启动时间可能比您想要的晚。所以先做所有的开始。

客户端也是如此,所以先做所有的开始,然后做连接。

【讨论】:

  • 我在服务器和客户端都像开始/开始/加入/加入一样发生​​了变化。然而,C2 仍然在 S3 之前开始(即在套接字上读取)(即在套接字中写入结果)。如何保证S3写完结果后C2才开始接收结果?
  • 您的客户端和服务器似乎太多了。客户端通常会发送一些请求并等待响应。服务器通常等待请求然后发送响应。服务器可能会启动一个新线程来处理客户端请求。
  • 这里是场景:只有一个客户端和一个服务器。服务器在一个线程(S1)中接收请求(文件)。服务器启动另一个线程 (S2) 并处理该文件。现在,服务器启动另一个线程(S3)来发送文件(由前一个线程 S2 保存在目录中)。客户端 C1 线程向服务器发送请求(文件)。客户端 C2 线程将接收文件并写入目录。当服务器 S3 线程尝试向客户端发送文件时,S3 线程抛出套接字。异常:套接字已关闭,服务器:null。在客户端,socket.exception:socket 已关闭,服务器:null。可能是什么原因
  • 好的,那么您的原始服务器启动/加入顺序可能是正确的。 c2 需要启动并等待连接。您可能需要发布更多代码。您可能正在尝试使用相同的套接字或其他东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多