我有这种代码移植到Java:
public class MyClass
{
Stream _stream;
AsyncCallback callback;
IAsyncResult readOperation;
public MyClass(string host, string port)
{
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(host, port);
_stream = tcpClient.GetStream();
callback = new AsyncCallback(Read);
readOp = _stream.BeginRead(headerBuffer, 0, 1, callback, null);
}
private void listen(IAsyncResult asyncResult)
{
_stream.EndRead(asyncResult);
//Do some work
readOperation = _stream.BeginRead(headerBuffer, 0, 1, callback, null);
}
}
我尝试过这个并没有取得真正的成功
es = Executors.newFixedThreadPool(2);
es.execute(new ListenTask());
和
public class ListenTask implements Runnable {
public void run() {
//Stream is a SocketChannel
_stream.socket().getInputStream().read(headerBuffer, 0, 1);
}
}
我应该使用SocketChannel.read()吗?
奖金问题:java的等价物是什么 readOperation.AsyncWaitHandle.WaitOne();
非常感谢
答案 0 :(得分:1)
Java有NIO支持非阻塞但不支持异步/事件驱动的IO。然而,各种库已经构建在NIO之上,提供了这种API /行为。
最好的一个是netty我可以从个人用途推荐。
编辑:我相信真正的异步IO将在Java 7中出现。
答案 1 :(得分:0)
我认为JDK中没有内置的直接语言,但是可以拼凑一个你自己的语言:
http://onjava.com/pub/a/onjava/2003/05/21/delegates.html
如果没有,那么也许Java NIO - 非阻塞I / O - 正是您正在寻找的。 p>
答案 2 :(得分:0)
AFAIK Java核心没有您正在寻找的异步i / o,但是自己创建一个似乎不是一个大问题 - 创建一些实现线程的类(一个用于读取,一个用于编写),使这些类的contstructors接受与BeginRead / BeginWrite相同的参数,添加委托,这就是全部。关于代表的文章可以在上面的答案中找到。