java 多執行緒 程式保護

心鑫發表於2013-11-07
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();
			
		}
	}
}


相關文章