java - 创建新对象后控制方法调用的调用
问题描述
我有一个预定的方法调用,它在预定的时间调用以下方法:
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
方法运行了几分钟并做了一些工作。我的问题是,当一个workNow
for FRUIT
(or VEGETABLE
) 正在进行并且另一个调用以相同的类型发生时(FRUIT
例如),它会创建一个新FruitClass
实例并开始workNow
并行执行它。
我该如何控制这种行为?我希望通过第二个对象的第二次调用等到第workNow
一个对象的第一次调用未完成。
澄清:
并行调用
FRUIT
andVEGETABLE
很好。我想控制相同类型的并行调用。两个或更多FRUIT
或两个或更多VEGETABLE
。我不能
FruitClass
和VegetableClass
单身人士一样。我需要一些包装代码来new
按我的意愿工作。
解决方案
在类对象上进行同步,这足以避免在完成之前创建另一个类:
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
on class object 使用类实例作为监视器。类对象实际上是一个单例(在运行时表示类元数据的对象),并且这个块中只能有一个线程。
推荐阅读
- jquery - 使用 jquery 在 node.js 服务器中解析 json 会出现 404 错误
- python - Python & Pyqt5:文件存在后创建按钮
- asp.net - 在模板字段中使用本地资源
- c++ - 如何在 qt for windows 中使用 QAxObject 创建 docx 和 doc 文件?
- powerbi - PowerBi 测量的不可理解的结果
- python - url 在表单操作中不匹配(python django)
- python - 时间序列预测:分析
- html - CSS 不等 div 框
- vuetify.js - 添加 vuetify 时,纱线中的 -D 选项是什么
- google-cloud-platform - 如何在 Google BigQuery 中设置用户的查询配额