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,>
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:Esto crea un nuevo
SingleThreadScheduledExecutor
para cada ArgumentType y lo asigna a la clave correspondiente en el mapa. Entonces, cada executor está programado para ejecutarwork()
a una tasa de tiempo fijo.En cuanto a su uso de
synchronized
en el métodowork()
, depende de cómo inicialice su clase y de cómo se compartemyMap
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 demyMap
. Si ese es el caso, agregarsynchronized
alrededor del bloque de código que modificamyMap
es correcto porque asegura que solo un hilo pueda modificar el mapa en cualquier momento dado.</argumenttype,></argumenttype,>