我有一个简单的模型 - 视图 - 控制器程序。模型需要定期更新,因此控制器有一个ScheduledThreadPoolExecutor,用于启动具有所需周期的Runnable。需要在此Runnable中调用模型的方法。
由于模型不是线程安全的 - 我想避免使其成为线程安全的 - 所有模型的方法都必须从同一个线程调用,以避免并发问题。
最好的方法是什么?
答案 0 :(得分:1)
您可以使用与模型相同的接口创建包装类。包装器类委托调用ScheduledThreadPoolExecutor并返回结果。
答案 1 :(得分:1)
你说这是一个Java MVC程序......这是否意味着你正在与GUI线程同步?在这种情况下,您需要在Runnable上调用SwingUtilities.invokeAndWait()或SwingUtilities.invokeLater()。这将在GUI线程上运行它,并避免线程与视图的问题。
还有其他非GUI方法也会更新模型吗?
答案 2 :(得分:0)
最简单的方法是在模型实例上进行同步:
synchronized(myModel) {
// periodical view update
}
然而,同步非私有对象不是最佳实践。所以很有可能你会有更好的想法。