invocação controle de uma chamada de método após nova criação do objeto

Vicky:

Eu tenho uma chamada de método programado que na hora programada chama o seguinte método:

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

A assinatura do método de workNowé como:

workNow() throws CustomException

workNowmétodo é executado por vários minutos e faz algum trabalho. Meu problema é, quando um workNowde FRUIT(ou VEGETABLE) está acontecendo e outra invocação acontece com mesmo tipo ( FRUITpor exemplo), ele cria uma nova FruitClassinstância e começa a executar a sua workNowparalelamente.

Como faço para controlar este comportamento? Quero que a segunda chamada através do segundo objeto que esperar até o primeiro workNowatravés primeiro objeto não está completa.

Esclarecer:

  • Invocação paralelo de FRUITe VEGETABLEestá bem. Eu quero controlar invocação paralela do mesmo tipo. Dois ou mais FRUITou dois ou mais VEGETABLE.

  • Eu não posso fazer FruitClasse VegetableClasscomo singletons. Eu preciso de algum código envolvendo em torno newao trabalho como eu quero.

user987339:

Fazer a sincronização em um objeto de classe, e isso vai ser suficiente para evitar a criação de uma outra classe até acabado:

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

synchronizedem objeto de classe usa a instância de classe como um monitor. Classe de objectos é, na verdade, um Singleton (o objecto que representa o metadados classe em tempo de execução), e somente um segmento pode ser neste bloco.

Acho que você gosta

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