Espere devolución de llamada desde otro hilo

Tobiq:

En primer lugar, he decidido hacer mi clase de bloqueo (para que sea más fácil para el consumidor para su uso - pero tal vez más tedioso para mí escribir). En lugar de tener el consumidor definir devoluciones de llamada asincrónicas. Es este un buen patrón de diseño? De esta manera, un usuario puede obtener el comportamiento esperado, pero poner en práctica su propia multi-threading si no está satisfecho con el tiempo que el hilo de bloqueado para.

Tengo un constructor que establece un campo final en una clase, con base en el resultado de una devolución de llamada asincrónica:

class Example {
    private final int x;

    Example(){
        asyncFunc(/* callback */ result -> x = result)
    }
}

Esto no funciona, por lo que he usado referencias atómicas, e implementó un bucle de bloqueo, hasta que el resultado se volvió, así:

class Example {
    private final int x;

    Example(){
        x = waitAsyncFunc();
    }

    private int waitAsyncFunc(){
        AtomicBoolean finished = new AtomicBoolean(false);
        AtomicReference<byte[]> result = new AtomicReference<>();
        asyncFunc(result -> {
            result .set(res);
            finished.set(true);
        });
        while (!finished.get()) { /* No op */ }
        return result.get();
    }

}

¿Es esta una buena forma de bloque / recuperar el resultado?

Holger:

La solución más simple sería

class Example {
    private final int x;

    Example() {
        CompletableFuture<Integer> f = new CompletableFuture();
        asyncFunc(f::complete);
        x = f.join();
    }
}

Pero considere la alternativa de esperar a la finalización de la tarea asíncrona, incluso antes de la construcción de la Exampleinstancia.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=478091&siteId=1
Recomendado
Clasificación