java多线程设计模式全部源码:
java多线程设计模式的全部源码
模式图
类图
时序图
代码
public class Main {
public static void main (String[] args) {
RequestQueue requestQueue = new RequestQueue();
new ClientThread(requestQueue, "r1" , 1111 l).start();
new ClientThread(requestQueue, "r2" , 2222 l).start();
new ServerThread(requestQueue, "s1" , 3333 l).start();
new ServerThread(requestQueue, "s2" , 4444 l).start();
}
}
import java.util.LinkedList;
public class RequestQueue {
private static LinkedList<Request> mQueue = new LinkedList<Request>();
public Request getRequest () {
synchronized (this ) {
while (mQueue.peek() == null ) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return mQueue.remove();
}
}
public void putRequest (Request request) {
synchronized (this ) {
mQueue.offer(request);
notifyAll();
}
}
}
public class Request {
private String name;
public Request (String name) {
super();
this .name = name;
}
public String getString () {
return "[ request " + name + " ]" ;
}
}
import java.util.Random;
public class ClientThread extends Thread {
private RequestQueue mRequestQueue;
Random mRandom;
public ClientThread (RequestQueue mRequestQueue, String name, long seed) {
super (name);
this .mRequestQueue = mRequestQueue;
mRandom = new Random(seed);
}
@Override
public void run () {
for (int i = 0 ; i < 1000 ; ++i) {
Request request = new Request(Thread.currentThread().getName() + " NO." + i);
System.out.println(Thread.currentThread().getName()
+ " request " + request.getString());
mRequestQueue.putRequest(request);
try {
Thread.sleep(mRandom.nextInt(1000 ));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import java.util.Random;
public class ServerThread extends Thread {
private Random mRandom;
private RequestQueue mRequestQueue;
public ServerThread (RequestQueue mRequestQueue, String name, long seed) {
super (name);
this .mRandom = new Random(seed);
this .mRequestQueue = mRequestQueue;
}
@Override
public void run () {
for (int i = 0 ; i < 1000 ; ++i) {
Request request = mRequestQueue.getRequest();
System.out.println(Thread.currentThread().getName() + " handle " + request.getString());
try {
Thread.sleep(mRandom.nextInt(1000 ));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
总结
Guarded(保护) Suspension(暂停、等待),上述例子中被保护的对象是RequestQueue类里面的mQueue对象。
当mQueue里面没有元素时,想要获取mQueue里面元素的ServerThread线程会一直等待。
如果用LinkedBlockingQueue就不需要加synchronized,因为LinkedBlockingQueue是线程安全的容器。
所以RequestQue.java的代码可以改为如下形式:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class RequestQueue {
private static BlockingQueue<Request> mQueue = new LinkedBlockingQueue<Request>();
public Request getRequest () {
Request request = null ;
try {
request = mQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
return request;
}
public void putRequest (Request request) {
try {
mQueue.put(request);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}