什么是Java中的CompletionHandler?它在异步IO中的作用是什么?
在Java NIO 2.0中,CompletionHandler
是一个接口,它是异步操作的回调机制。当你发起一个异步操作时,可以提供一个实现了CompletionHandler
接口的对象,当异步操作完成时,系统会自动调用该对象的回调方法。
CompletionHandler
接口有两个方法:
completed(V result, A attachment)
: 当异步操作成功完成时,该方法被调用。result
参数是异步操作的结果,attachment
参数是在发起异步操作时传入的任意类型的对象,通常用于传递一些附加信息。failed(Throwable exc, A attachment)
: 当异步操作失败时,该方法被调用。exc
参数是导致操作失败的异常,attachment
参数是在发起异步操作时传入的任意类型的对象。
在异步IO操作中,CompletionHandler
的主要作用如下:
- 异步回调: 异步IO操作通常不会立即完成,程序需要某种方式来得知操作何时完成以及完成的结果。
CompletionHandler
提供了这样一种机制,允许你在异步IO操作完成时执行一些操作,例如处理读或写操作的结果,或者处理操作失败的情况。 -
非阻塞: 由于
CompletionHandler
的回调方法在异步操作完成时被自动调用,程序不需要阻塞等待异步操作的完成。这使得程序可以同时处理多个异步IO操作,提高了程序的效率和响应能力。
以下是一个使用CompletionHandler
的例子,它发起一个异步读操作,并在读操作完成时打印读取的字节数:
ByteBuffer buffer = ByteBuffer.allocate(1024);
AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ);
channel.read(buffer, 0, null, new CompletionHandler<Integer, Void>() {
@Override
public void completed(Integer result, Void attachment) {
System.out.println("Bytes read: " + result);
}
@Override
public void failed(Throwable exc, Void attachment) {
System.out.println("Read failed");
exc.printStackTrace();
}
});
在这个例子中,当读操作完成时,completed
方法会被调用,并打印读取的字节数。如果读操作失败,failed
方法会被调用,并打印错误信息。