Tengo una llamada al método previsto en la cual la hora programada llama al método siguiente:
private void doSomething(Map<String, String> someArguments) throws CustomException {
MyEnum runType = getRunType(someArguments);
switch (runType) {
case FRUIT:
new FruitClass().workNow();
break;
case VEGETABLE:
new VegetableClass().workNow();
break;
default:
// log that the type is not known
}
}
La firma del método de workNow
es como:
workNow() throws CustomException
workNow
método se ejecuta durante varios minutos y hace un trabajo. Mi problema es, cuando uno workNow
de FRUIT
(o VEGETABLE
) que está pasando y otra invocación sucede con el mismo tipo ( FRUIT
por ejemplo), se crea una nueva FruitClass
instancia y se inicia la ejecución de su workNow
paralelamente.
¿Cómo puedo controlar este comportamiento? Quiero que la segunda invocación a través segundo objeto que esperar hasta la primera workNow
a través del primer objeto no es completa.
Para aclarar:
Invocación paralela de
FRUIT
yVEGETABLE
está muy bien. Quiero controlar la invocación paralela del mismo tipo. Dos o másFRUIT
o dos o másVEGETABLE
.No puedo hacer
FruitClass
yVegetableClass
como simple. Necesito un poco de código de envoltura alrededornew
de trabajo como quiero.
Hacer la sincronización en un objeto de clase, y esto será suficiente para evitar la creación de otra clase hasta final:
private void doSomething(Map<String, String> someArguments) {
MyEnum runType = getRunType(someArguments);
switch (runType) {
case FRUIT:
synchronized (FruitClass.class){
new FruitClass().workNow();
}
break;
case VEGETABLE:
synchronized (VegetableClass.class){
new VegetableClass().workNow();
}
break;
default:
// log that the type is not known
}
}
synchronized
en objeto de clase utiliza la instancia de clase como un monitor. objeto Class es en realidad un singleton (el objeto que representa los metadatos clase en tiempo de ejecución), y sólo un hilo puede ser en este bloque.