Поскольку мы знаем, что Java NIO поддерживает параллелизм и многопоточность, что позволяет нам одновременно работать с разными каналами. Таким образом, API, ответственный за это в пакете Java NIO, — это AsynchronousFileChannel, который определен в пакете каналов NIO. для AsynchronousFileChannel — это java.nio.channels.AsynchronousFileChannel .
AsynchronousFileChannel аналогичен FileChannel NIO, за исключением того, что этот канал позволяет файловым операциям выполняться асинхронно, в отличие от операции синхронного ввода-вывода, в которой поток входит в действие и ожидает завершения запроса. Таким образом, асинхронные каналы безопасны для использования. несколькими параллельными потоками.
В асинхронном запросе поток передается ядру операционной системы, чтобы выполнить его, в то время как поток продолжает обрабатывать другое задание. Как только задание ядра выполнено, он сигнализирует потоку, затем поток подтверждает сигнал и прерывает текущее задание и обрабатывает Работа ввода / вывода по мере необходимости.
Для достижения параллелизма этот канал предоставляет два подхода, один из которых заключается в возврате объекта java.util.concurrent.Future, а другой — в передачу операции типа java.nio.channels.CompletionHandler .
Мы разберем оба подхода с помощью примеров один за другим.
-
Future Object — в этом случае экземпляр Future Interface возвращается из канала. В Future interface есть метод get (), который возвращает состояние операции, которая обрабатывается асинхронно, на основе которой может быть принято решение о дальнейшем выполнении другой задачи. Мы можем также проверьте, выполнена ли задача или нет, вызвав ее метод isDone .
Future Object — в этом случае экземпляр Future Interface возвращается из канала. В Future interface есть метод get (), который возвращает состояние операции, которая обрабатывается асинхронно, на основе которой может быть принято решение о дальнейшем выполнении другой задачи. Мы можем также проверьте, выполнена ли задача или нет, вызвав ее метод isDone .
пример
В следующем примере показано, как использовать объект Future и выполнять асинхронные задачи.
package com.java.nio; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousFileChannel; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; public class FutureObject { public static void main(String[] args) throws Exception { readFile(); } private static void readFile() throws IOException, InterruptedException, ExecutionException { String filePath = "D:fileCopy.txt"; printFileContents(filePath); Path path = Paths.get(filePath); AsynchronousFileChannel channel =AsynchronousFileChannel.open(path, StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(400); Future<Integer> result = channel.read(buffer, 0); // position = 0 while (! result.isDone()) { System.out.println("Task of reading file is in progress asynchronously."); } System.out.println("Reading done: " + result.isDone()); System.out.println("Bytes read from file: " + result.get()); buffer.flip(); System.out.print("Buffer contents: "); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } System.out.println(" "); buffer.clear(); channel.close(); } private static void printFileContents(String path) throws IOException { FileReader fr = new FileReader(path); BufferedReader br = new BufferedReader(fr); String textRead = br.readLine(); System.out.println("File contents: "); while (textRead != null) { System.out.println(" " + textRead); textRead = br.readLine(); } fr.close(); br.close(); } }
Выход
File contents: To be or not to be? Task of reading file is in progress asynchronously. Task of reading file is in progress asynchronously. Reading done: true Bytes read from file: 19 Buffer contents: To be or not to be?
-
Обработчик завершения —
Этот подход довольно прост, поскольку в этом мы используем интерфейс CompletionHandler и переопределяем два его метода: один метод complete (), который вызывается при успешном завершении операции ввода-вывода, а другой — метод fail (), который вызывается, если операции ввода-вывода fails.In при этом создается обработчик для использования результата асинхронной операции ввода-вывода, поскольку после завершения задачи только обработчик имеет функции, которые выполняются.
Обработчик завершения —
Этот подход довольно прост, поскольку в этом мы используем интерфейс CompletionHandler и переопределяем два его метода: один метод complete (), который вызывается при успешном завершении операции ввода-вывода, а другой — метод fail (), который вызывается, если операции ввода-вывода fails.In при этом создается обработчик для использования результата асинхронной операции ввода-вывода, поскольку после завершения задачи только обработчик имеет функции, которые выполняются.
пример
В следующем примере показано, как использовать CompletionHandler для асинхронной задачи.