如果执行现在的处理会造成问题,就让执行处理的线程进行等待。
示例
一个线程(ClientThread)会将请求(Request)的实例传递给另一个线程(ServerThread),这是一种最简单的线程间通信。
时序图
Request.java
1 | public class Request { |
RequestQueue.java
1 | import java.util.LinkedList; |
ClientThread.java
1 | import java.util.Random; |
ServerThread.java
1 | import java.util.Random; |
Main.java
1 | public class Main { |
运行结果
1 | Alice requests [ Request No.0 ] |
登场角色
GuardedObject(被守护的对象)
GuardedObject角色是一个持有被守护的方法(guardedMethod)的类。当线程执行guardedMethod方法时,若守护条件成立,则可以立即执行;当守护条件不成立时,就要进行等待。守护条件的成立与否会随着GuardedObject角色的状态不同而发生变化。
除了guardedMethod之外,GuardedObject角色还有可能持有其他改变实例状态(特别是改变守护条件)的方法(stateChangingMethod)。
在Java中,guardedMethod通过while语句和wait方法来实现,stateChangingMethod则通过notify/notifyAll方法来实现。
在示例程序中,由RequestQueue类扮演此角色。getRequest方法对应guardedMethod,putRequest方法则对应stateChangingMethod。
类图
Timethreads图
使用java.util.concurrent.LinkedBlockingQueue
RequestQueue.java
1 | import java.util.concurrent.BlockingQueue; |