首页 > 解决方案 > 创建新对象后控制方法调用的调用

问题描述

我有一个预定的方法调用,它在预定的时间调用以下方法:

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

的方法签名workNow如下:

workNow() throws CustomException

workNow方法运行了几分钟并做了一些工作。我的问题是,当一个workNowfor FRUIT(or VEGETABLE) 正在进行并且另一个调用以相同的类型发生时(FRUIT例如),它会创建一个新FruitClass实例并开始workNow并行执行它。

我该如何控制这种行为?我希望通过第二个对象的第二次调用等到第workNow一个对象的第一次调用未完成。

澄清:

标签: java

解决方案


在类对象上进行同步,这足以避免在完成之前创建另一个类:

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

synchronizedon class object 使用类实例作为监视器。类对象实际上是一个单例(在运行时表示类元数据的对象),并且这个块中只能有一个线程。


推荐阅读