我有一个Manager
类,它封装了一个(相当)低级设施(例如数据库),并作为Worker
实例的工厂,
Manager
的基础设施(数据库)Manager
Manager
还有一个关闭数据库连接的shutdown()
方法。如果任何worker
启动任何正在运行的线程(即在仍有工作人员使用它之前不关闭数据库连接),以确保连接将保持活动状态,我目前有类似的内容:
Manager mgr = new Manager(database);
Worker worker = mgr.newWorker(arg0, arg1, arg2);
worker.runHeavyComputation();
其中runHeavyComputation
的定义如下:
void runHeavyComputation() {
executor.execute(() -> {
myManager.tellTaskLaunched();
doSomethingWithDatabase();
myManager.tellTaskFinished();
});
}
其中Manager#tellTaskLaunched()
和Manager#tellTaskLaunched()
的定义如下:
void tellTaskLaunched() {
taskCounter.incrementAndGet();
}
void tellTaskFinished() {
taskCounter.decrementAndGet();
}
和Manager#shutdown()
看起来像这样:
void shutdown() {
while (taskCounter.get() > 0) {}
databaseConnection.close();
database.shutdown()
}
据我所知,对于这样一个简单的问题,这是一个冗长的介绍,但由于我几乎在我阅读的每本书或帖子中都遇到了反忙等待的陈述,我觉得可能有一些替代方案我在这里提供的简单解决方案,所以我想听听你的意见。
请注意,由于shutdown()
可能每个应用程序生命周期调用一次(或者它们称为单个长期运行),因此它不是真正的性能问题。但是,如果出现更好的事情,我仍然会改变它。
P.S。请注意,虽然我说“你的意见”,但这不是一个基于意见的基于的问题:)
答案 0 :(得分:0)
在操作系统级别以上的任何地方,总有一种比繁忙等待更好的选择。
例如,参见Thread上的等待和通知操作。