Comme il a été mentionné, il n'y a pas d'équivalent direct, mais une approximation très proche pourrait être créée avec des modifications du bytecode Java (à la fois pour les instructions de type async/await et l'implémentation des continuations sous-jacentes).
Je travaille en ce moment sur un projet qui implémente async/await au dessus de Suite de JavaFlow bibliothèque, veuillez vérifier https://github.com/vsilaev/java-async-await
Aucun mojo Maven n'est encore créé, mais vous pouvez exécuter les exemples avec l'agent Java fourni. Voici à quoi ressemble le code async/await :
public class AsyncAwaitNioFileChannelDemo {
public static void main(final String[] argv) throws Exception {
...
final AsyncAwaitNioFileChannelDemo demo = new AsyncAwaitNioFileChannelDemo();
final CompletionStage<String> result = demo.processFile("./.project");
System.out.println("Returned to caller " + LocalTime.now());
...
}
public @async CompletionStage<String> processFile(final String fileName) throws IOException {
final Path path = Paths.get(new File(fileName).toURI());
try (
final AsyncFileChannel file = new AsyncFileChannel(
path, Collections.singleton(StandardOpenOption.READ), null
);
final FileLock lock = await(file.lockAll(true))
) {
System.out.println("In process, shared lock: " + lock);
final ByteBuffer buffer = ByteBuffer.allocateDirect((int)file.size());
await( file.read(buffer, 0L) );
System.out.println("In process, bytes read: " + buffer);
buffer.rewind();
final String result = processBytes(buffer);
return asyncResult(result);
} catch (final IOException ex) {
ex.printStackTrace(System.out);
throw ex;
}
}
@async est l'annotation qui signale qu'une méthode est exécutable de manière asynchrone, await() est une fonction qui attend un CompletableFuture en utilisant des continuations et un appel à "return asyncResult(someValue)" est ce qui finalise le CompletableFuture/Continuation associé.
Comme en C#, le flux de contrôle est préservé et la gestion des exceptions peut être effectuée de manière régulière (try/catch comme dans un code exécuté de manière séquentielle).