如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回。
示例
定期将当前数据内容写入文件中。当数据内容被写入时,会完全覆盖上次写入的内容,只有最新的内容才会被保存。
时序图
Data.java
1 | import java.io.FileWriter; |
SaverThread.java
1 | import java.io.IOException; |
ChangerThread.java
1 | import java.io.IOException; |
Main.java
1 | public class Main { |
运行结果
1 | SaverThread calls doSave, content = No.0 |
登场角色
GuardedObject(被防护的对象)
GuardedObject角色是一个拥有被防护的方法(guardedMethod)的类。当线程执行guardedMethod方法时,若守护条件成立,则执行实际的处理。而当守护条件不成立时,则不执行实际的处理,直接返回。守护条件的成立与否,会随着GuardedObject角色的状态变化而发生变化。
除了guardedMethod之外,GuardedObject角色还有可能有其他来改变状态的方法(stateChangingMethod)。
在示例程序中,由Data类扮演此角色。save方法对应的是guardedMethod,change方法对应的则是stateChangingMethod。
类图
Timethreads图
balk结果的表示方式
当从guardedMethod方法中balk并返回时,balk结果的表示方式有如下几种。
忽略balk
最简单的方式就是不通知调用端“发生了balk”。
通过返回值来表示balk
有时会通过boolean类型的值来表示balk。例如,若返回值为true,则表明未发生balk,处理被执行了,而如果为false,则表明发生了balk,处理并未被执行。
返回值为引用类型的方法有时也会用null来表示“发生了balk”。
通过异常来表示balk的发生
有时也可以通过异常来表示“发生了balk”。即,当balk发生时,程序并不是从方法中return,而是抛出异常。