package com.example.design.guarded_suspension;
public class Request {
String name;
public Request(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Request [name=" + name + "]";
}
}
package com.example.design.guarded_suspension;
import java.util.LinkedList;
public class RequestQueue {
LinkedList<Request> queue = new LinkedList<Request>();
public LinkedList<Request> getQueue() {
return queue;
}
public void addQueue(Request req) {
synchronized (queue) {
queue.add(req);
queue.notify();
}
}
public Request getRequest() {
synchronized (queue) {
if (queue.size() == 0) {
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return queue.remove();
}
}
}
package com.example.design.guarded_suspension;
import java.util.LinkedList;
public class RequestQueue {
LinkedList<Request> queue = new LinkedList<Request>();
public LinkedList<Request> getQueue() {
return queue;
}
public synchronized void addQueue(Request req) {
// synchronized (queue) {
queue.add(req);
// queue.notify();
notify();
// }
}
public synchronized Request getRequest() {
// synchronized (queue) {
if (queue.size() == 0) {
try {
// queue.wait();
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return queue.remove();
// }
}
}
package com.example.design.guarded_suspension;
public class ClientThread extends Thread {
RequestQueue rq;
static int num=0;
public ClientThread(RequestQueue rq) {
super();
this.rq = rq;
}
@Override
public void run() {
put();
super.run();
}
private void put(){
for (int i = 0; i < 10; i++) {
rq.addQueue(new Request("name-->"+num++));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.example.design.guarded_suspension;
public class ServerThread extends Thread {
RequestQueue rq;
public ServerThread(RequestQueue rq) {
super();
this.rq = rq;
}
@Override
public void run() {
this.get();
super.run();
}
private void get() {
while(true) {
Request req = rq.getRequest();
System.out.println(Thread.currentThread().getName()+"-server->"+req);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.example.design.guarded_suspension;
public class Test {
public static void main(String[] args) {
RequestQueue rq = new RequestQueue();
for (int i = 0; i < 100; i++) {
new ServerThread(rq).start();
}
for (int i = 0; i < 200; i++) {
new ClientThread(rq).start();
}
}
}