【问题标题】:Return data from thread before finished task. (JAVA)在完成任务之前从线程返回数据。 (JAVA)
【发布时间】:2015-09-21 01:36:52
【问题描述】:

客户端/服务器应用程序。 多个客户端可以连接到服务器。 对于每个客户端连接,服务器都会创建新线程。 客户端发送数据直到它关闭套接字。 所以我需要线程服务器管理的数据每次都应该返回到主服务器。我等不及线程完成他的工作,因为我不知道客户端何时关闭连接。 什么是正确的方法?

【问题讨论】:

  • 你需要像C#'s yield return 这样的东西。试试这个链接 - stackoverflow.com/questions/1980953/…
  • 您可以在主服务器上调用方法并传递信息。所以主服务器可以在它自己的字段中读取这些信息
  • “主服务器”是什么意思?你不是在谈论运行 in 服务器的线程吗?我认为,如果您能更好地定义“重调到主服务器”的含义,那么您的问题的答案可能会变得显而易见。
  • 主(线程)服务器创建新线程。例如,服务器永远循环,直到客户端连接到它,服务器为此客户端创建新线程。线程从客户端获取数据,并希望在 GUI 中将这些数据显示给服务器。对多个客户重复此操作。

标签: java multithreading client-server


【解决方案1】:

创建线程时,您可以将共享队列作为参数传递。在线程的主体中,当您从客户端获取数据时,将其推送到队列中。在您的服务器循环中轮询队列中的数据并使用它。 ConcurrentLinkedQueue 应该是合适的。示例:

// main server thread
Queue<SomeData> queue = new ConcurrentLinkedQueue<>();

// ... loop code, etc
Thread thread = new MyThread(queue);

// in thread responsible for GUI updates
SomeData data = queue.poll();
if (data != null) // do something

// client connection thread
SomeData data = ... // received from client
queue.offer(data);

【讨论】:

  • 这里的问题是,只有当服务器获得客户端连接时,才能进行数据更新,因为它在ServerSocket.accept()方法中等待。
  • 因此您需要另一个负责数据更新的线程,因为 accept() 会阻塞执行它的线程。生成一个线程来更新 GUI,然后才开始监听连接
猜你喜欢
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2020-05-28
  • 2014-08-25
  • 1970-01-01
相关资源
最近更新 更多