在得到java响应之前,如何停止方法?

在得到java响应之前,如何停止方法?,java,multithreading,client-server,nio,Java,Multithreading,Client Server,Nio,我编写了一个简单的TCP服务器程序,从客户端接收数据。我的main()方法如下所示: Acceptor acceptor = Acceptor.open(new InetSocketAddress(port)); Session session = acceptor.accept(); //accepts connection from client and returns session object FIXSession transport = session.getTransport();

我编写了一个简单的TCP服务器程序,从客户端接收数据。我的main()方法如下所示:

Acceptor acceptor = Acceptor.open(new InetSocketAddress(port));
Session session = acceptor.accept(); //accepts connection from client and returns session object
FIXSession transport = session.getTransport();
String str = transport.receive(); // receives data from client

doWork(str); // do the remaining process.
在上面的代码中,我尝试使用“transport.receive()”方法从客户端接收数据。如果假设客户端需要一些时间来发送数据,同时我的主程序将进入下一步“doWork(str);”,结果为空。如何使main()线程等待从客户端接收数据。将来我可能会在其他线程中运行doWork(str)方法。因此,我需要让doWork(str)线程等待,直到我从客户端获得数据。有什么办法吗?

引用OP:

即使它返回字节数,如果接收的字节数小于0,它也必须等待,直到接收的字节数大于0

因此,将其转化为阻塞调用的直接方法是:

int numBytes = transport.receive();
while (numBytes == 0) {
  Thread.sleep(SOME_TIME);
  numBytes = transport.receive();
}
比如说。如果您希望代码等待;然后编写等待的代码。但当然,这仍然不能回答如何实际接收消息。因为您需要一个
MessageListener
来实际接收消息。

引用OP:

即使它返回字节数,如果接收的字节数小于0,它也必须等待,直到接收的字节数大于0

因此,将其转化为阻塞调用的直接方法是:

int numBytes = transport.receive();
while (numBytes == 0) {
  Thread.sleep(SOME_TIME);
  numBytes = transport.receive();
}

比如说。如果您希望代码等待;然后编写等待的代码。但当然,这仍然不能回答如何实际接收消息。因为您需要一个
MessageListener
来实际接收消息。

您需要提供有关代码的更多信息。receive方法的代码是什么?如果您使用的是API,我正在查看“project:Philadelphia”transport.receive返回字节数。看起来你需要设置一个消息侦听器。是的,我正在使用费城。即使它返回字节数,如果接收的字节数小于0,它也必须等待,直到接收的字节数大于0。但这只是跳到下一步。我希望它等到客户端将数据发送到服务器。这就是接收的字节数应该大于零。实际上,接收函数只返回str。我修改了源代码以返回字符串。我的代码中没有检查您的进程。我明天做。然后我可以投票赞成你的答案。到目前为止,你的答案最适合我。谢谢好吧,至少我现在看到的那一个不是这个。此方法返回int,而不是字符串。也许您应该澄清您的问题,并指出您正在使用的库的确切版本。您需要提供有关代码的更多信息。receive方法的代码是什么?如果您使用的是API,我正在查看“project:Philadelphia”transport.receive返回字节数。看起来你需要设置一个消息侦听器。是的,我正在使用费城。即使它返回字节数,如果接收的字节数小于0,它也必须等待,直到接收的字节数大于0。但这只是跳到下一步。我希望它等到客户端将数据发送到服务器。这就是接收的字节数应该大于零。实际上,接收函数只返回str。我修改了源代码以返回字符串。我的代码中没有检查您的进程。我明天做。然后我可以投票赞成你的答案。到目前为止,你的答案最适合我。谢谢好吧,至少我现在看到的那一个不是这个。此方法返回int,而不是字符串。也许你应该澄清你的问题,并指出你正在使用的库的确切版本。这个API肯定已经有阻塞I/O了吗?沉睡在网络代码中是上帝所憎恶的。这个API肯定已经有阻塞I/O了吗?睡在网络密码中是上帝所憎恶的。