我正在尝试模拟java中网格计算的作业检查点。我有两个类Job和CheckPointInterrupter是线程。 CheckPointInterrupter类定期检查作业的检查点。
为了简化模拟,我只是将Job变量的值作为检查点状态。 关于Job类的设计我面临两难选择。由于现在不推荐使用suspend()和resume()方法,我不希望CheckPointInterrupter在Job上使用它们。所以我寻找替代方案并找到了http://www.java2s.com/Code/Java/Threads/Anotherwaytosuspendandresume.htm
如果这是要走的路,那么我必须将检查点相关的代码引入Job类。这不违反班级单一责任的原则吗?另外,有人可以告诉我网格/分布式环境中作业的本质吗?这些工作会让自己“检查”吗?任何建议/指向资源/谷歌搜索术语将非常感谢。感谢。
答案 0 :(得分:0)
不知道你正在实施什么样的“网格计算”,你唯一的机会就是让“工人”方法意识到它的可中断性。基本上这就是中断通常在java中的工作方式。
正如您所看到的那样,stop()
,suspend()
,resume()
已被弃用,因为它们可能会导致死锁。
Ť
现在只有中断线程的方法是使用Thread.interrupt()
并让“worker”方法通过定期查询Thread.interrupted()
来处理中断。
另一种方法是实现一些其他协议来通知工作线程被暂停/恢复/无论如何,但关键是,工人方法必须知道这一点。
你是对的,这违反了单一关注原则,但在实践中,你可以将几乎所有这些逻辑提取到专门为此设计的类中(例如某种“SuspensionHandler”,“WorkContext”等)。
然而,这是一个非常复杂的领域,有很多书提供了很好的建议。 (我非常喜欢 Java Concurrency in Practice ,如果我没记错的话,那里有一个类似的例子。)