Cómo usar ExecuteService con subprocesos personalizados que contienen un recurso AutoCloseable

Presento aquí una simplificación del problema que estoy tratando de resolver. Resumen de las clases que presento:

  • Procesador: es una clase no segura para subprocesos, que se puede crear sin argumentos y debe cerrarse cuando termine de usarla. Crear instancias de esta clase es realmente costoso, por lo que solo se debe crear una (por subproceso). Proporciona métodos para hacer ciertas operaciones.
  • ResultProvider: es una clase segura para subprocesos que gestiona solicitudes que necesitan un procesador para ser manejado.

La implementación actual es similar a la siguiente:

class Processor implements AutoCloseable { (...) }

class ResultProvider implements AutoCloseable {

    private final Processor processor;

    public ResultProvider() {
        this.processor = Processor.createNewProcessor();
    }

    /*
     * The 'request' doesn't turn a Procesoor into a T, it rather uses a Processor
     * as a resource, to be able to compute a T
     */
    public synchronized <T> T handle(Function<Processor, T> request) {
        request.apply(processor);
    }

    public synchronized void close() {
        processor.close();
    }
}

Ahora quiero hacer que ResultProvider pueda usar varios núcleos de CPU. Idealmente, me gustaría poder usar un ExecutorService para hacer esto. Tenga en cuenta que cada subproceso necesita instanciar su propio procesador al inicio y necesita .close () cuando el subproceso se va a eliminar. El 'ExecutorService' probablemente debería usar un ThreadFactory que crea una subclase de Thread personalizada que instancia y cierra un procesador interno.

Creo que lo que quiero sería algo como esto:

class ResultProvider implements AutoCloseable {

    private static class ProcessorThread extends Thread {
        final private Processor processor = Processor.createNewProcessor();

        public void run() {
            try {
                super.run();
            } finally {
                processor.close();
            }
        }
    }

    private final ExecutorService executor;
    /*
     * Not sure how to create one that uses my ProcessorThread and is able
     * to be submitted Function<Processor, T> to get T...
     */

    public ResultProvider() {
        // ...
    }

    /*
     * The 'request' doesn't turn a Procesoor into a T, it rather uses a Processor
     * as a resource, to be able to compute a T
     */
    public <T> T handle(Function<Processor, T> request) {
        return executor.submit?(request).get();
    }

    public synchronized void close() {
        executor.shutdown();
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
    }
}

Ahora, ¿es factible? No sé cómo implementar esto usando la mayor cantidad posible de clases concurrentes de Java. ¿Algún consejo?

Respuesta 1

¡Saludos compañeros programadores! Tengo un problema importante al descomponer xml en un objeto. Necesito crear una referencia a un objeto. ¿Cómo puedo lograrlo? He intentado usar XSL ...

(Procesando) El código no devuelve lo que quiero. Básicamente, hay dos jugadores, y cada jugador se turna para lanzar un dado. Los valores deben almacenarse en la variable "p1diceroll" y "...

En mi colección, los documentos se ven así: logré obtener el último documento insertado haciendo esto: collection.find (). Sort (new Document ("date", - 1)). First (). GetDate () Pero ahora necesito ...

Deseo obtener el nombre del servidor y el puerto de la aplicación actual al iniciar el servidor. Logré obtener el nombre de host y la dirección con: hostName = InetAddress.getLocalHost (). GetHostName (); hostAddress = ...