es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Haga que scheduledExecutor llame a un método con argumentos diferentes, de modo que cada hilo procese solo un argumento.

En mi constructor de clase, creo un ejecutor:

scheduledExecutorService = Executors.newScheduledThreadPool(
    ARGUMENTS.size(),
    ExecutorServiceUtils.createThreadFactory("process-%d"));

Tengo un conjunto llamado ARGUMENTS que contiene 5 ArgumentTypes (un enum) (ARG1, ARG2, ARG3, ARG4, ARG5).

Programo un trabajo periódico para cada uno:

for (ArgumentType arg : ARGUMENT_TYPES) {
    scheduledExecutorService.scheduleAtFixedRate(() -> 
        work(arg),
        SCHEDULED_TASK_INITIAL_DELAY_MILLIS, 
        1L, TimeUnit.MILLISECONDS);
}

Luego tengo un método llamado work(ArgumentType). Cuando los hilos se ejecutan, veo en mis registros que cualquier hilo puede llamar al método work con cualquiera de los 5 ArgumentTypes.

Esto no es realmente lo que quiero hacer. Me gustaría tener un hilo dedicado a cada uno de los argumentTypes, donde el proceso-0 siempre haría el arg1, por ejemplo.

Pero veo que los 5 hilos están llamando work con cualquiera de los ArgumentTypes.

¿Cómo puedo programar mis hilos para que cada intervalo, los 5 tipos de documentos se procesen simultáneamente?

Además, en mi método work, tengo este código, donde myMap es un ConcurrentHashMap<String, WorkValue> donde WorkValue es un enum. Si el valor de una entrada es WorkValue.READY, quiero establecerlo en WorkValue.PROCESSING. Como varios hilos llaman a esto, he agregado un bloque sincronizado.

for (Map.Entry<string, workvalue=""> entry : myMap.entrySet()) {
    synchronized (this) {
        if (entry.getValue().equals(WorkValue.READY)) {
            entry.setValue(WorkValue.PROCESSING);
            ids.add(entry.getKey());
        }
    }
}

¿Es correcto mi uso de synchronized aquí?</string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para programar cada hilo para procesar un tipo de ArgumentType específico, puede utilizar un Map<argumenttype, scheduledexecutorservice=""> para asignar cada tipo a un executor específico. Por ejemplo:

    Map<argumenttype, scheduledexecutorservice=""> executors = new HashMap<>();
    for (ArgumentType type : ARGUMENT_TYPES) {
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(
                ExecutorServiceUtils.createThreadFactory("process-" + type.name()));
        executors.put(type, executor);
        executor.scheduleAtFixedRate(() -> work(type),
                SCHEDULED_TASK_INITIAL_DELAY_MILLIS,
                1L, TimeUnit.MILLISECONDS);
    }
    

    Esto crea un nuevo SingleThreadScheduledExecutor para cada ArgumentType y lo asigna a la clave correspondiente en el mapa. Entonces, cada executor está programado para ejecutar work() a una tasa de tiempo fijo.

    En cuanto a su uso de synchronized en el método work(), depende de cómo inicialice su clase y de cómo se comparte myMap entre hilos. Debe asegurarse de que todos los hilos estén accediendo a la misma instancia de la clase y, por lo tanto, a la misma instancia de myMap. Si ese es el caso, agregar synchronized alrededor del bloque de código que modifica myMap es correcto porque asegura que solo un hilo pueda modificar el mapa en cualquier momento dado.</argumenttype,></argumenttype,>

Comments are closed.