public class RequestQueue {
private LinkedList<Request> queue = new LinkedList<>();
public synchronized Request getRequest() {
while (queue.isEmpty()) {
try {
wait();//等待直到有新的 Request 加入
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//返回 Request 队列中的第一个请求
return (Request) queue.remove();
}
public synchronized void addRequest(Request request) {
//加入新的 Request 请求
queue.add(request);
// 通知 getRequest() 方法
notify();
}
}
Main:主方法。
public class GuardedSuspensionMode {
public static void main(String[] args) {
RequestQueue queue = new RequestQueue();
for (int i = 0; i < 10; i++) {
new ServerThread("ServerTread#" + i, queue).start();
}
for (int i = 0; i < 10; i++) {
new ClientThread("ClientTread#" + i, queue).start();
}
}
static class ServerThread extends Thread {
private RequestQueue requestQueue;
public ServerThread(String name, RequestQueue requestQueue) {
super(name);
this.requestQueue = requestQueue;
}
@Override
public void run() {
while (true) {
final Request request = requestQueue.getRequest();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " handle " + request);
}
}
}
static class ClientThread extends Thread {
private RequestQueue requestQueue;
public ClientThread(String name, RequestQueue requestQueue) {
super(name);
this.requestQueue = requestQueue;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
Request request = new Request("RequestId" + i + "ThreadName "
+ Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName() + " requests "
+ request);
requestQueue.addRequest(request);
try {
//Client 请求速度大于 server的速度
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ClientThread Name is :" + Thread.currentThread().getName());
}
System.out.println(Thread.currentThread().getName() + " Request end");
}
}
}
不变模式 final
不变模式使用场景
当对象被创建后,其内部状态与数据不会再发生任何变化
对象需要被共享、被多线程频繁的访问
不变模式实现
去除 Setter 等可以修改自身属性的方法
将所有属性设置为私有,并使用 final 标记,确保其不可修改
确保没有子类可以重载修改它的行为,使用final修饰类可以实现
有一个可以创建完整对象的构造函数
/**
* 使用 final 关键字修饰类和所有属性
*/
public final class ObjectClazz{
private final String name;
public ObjectClazz(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}