invocación control de una llamada a un método nuevo después de la creación de objetos

Vicky:

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 workNowes como:

workNow() throws CustomException

workNowmétodo se ejecuta durante varios minutos y hace un trabajo. Mi problema es, cuando uno workNowde FRUIT(o VEGETABLE) que está pasando y otra invocación sucede con el mismo tipo ( FRUITpor ejemplo), se crea una nueva FruitClassinstancia y se inicia la ejecución de su workNowparalelamente.

¿Cómo puedo controlar este comportamiento? Quiero que la segunda invocación a través segundo objeto que esperar hasta la primera workNowa través del primer objeto no es completa.

Para aclarar:

  • Invocación paralela de FRUITy VEGETABLEestá muy bien. Quiero controlar la invocación paralela del mismo tipo. Dos o más FRUITo dos o más VEGETABLE.

  • No puedo hacer FruitClassy VegetableClasscomo simple. Necesito un poco de código de envoltura alrededor newde trabajo como quiero.

user987339:

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 
    }
}

synchronizeden 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.

Supongo que te gusta

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