在Thread-Per-Message模式中,其实已经有点Worker Thread的概念,在Service物件接收到数据后,以匿名方式建立线程来处理数据,那个建立的线程就是Worker Thread,只不用过就丢了。
Worker Thread可以应用在不同的场合,例如在Guarded Suspension模式的示例,是使用一个线程来处理请求队列中的请求,如果请求不断来到,且请求中可能有冗长的处理,则请求队列中的请求可能会来不及消化。
您可以为请求队列中的每个请求配给一个线程来处理,不过实际上,只要建立足够多的线程即可,在以下的示例中,可以指定请求队列预先建立的线程数量,每个线程会取出一个请求来执行。
import java.util.*;
interface Request {
void execute();
}
class Worker implements Runnable {
private RequestQueue queue;
Worker(RequestQueue queue) {
this.queue = queue;
}
public void run() {
while(true) {
queue.get().execute();
}
}
}
class RequestQueue {
private LinkedList requests;
RequestQueue(int workers) {
requests = new LinkedList();
for(int i = 0; i < workers; i++) {
(new Thread(new Worker(this))).start();
}
}
synchronized Request get() {
while(requests.size() == 0) {
try {
wait();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
return requests.removeFirst();
}
synchronized void put(Request request) {
requests.addLast(request);
notifyAll();
}
}
// 模拟 Client 置入请求
class Client implements Runnable {
private RequestQueue queue;
Client(RequestQueue queue) {
this.queue = queue;
}
public void run() {
while(true) {
Request request = new Request() {
public void execute() {
System.out.println("执行客户请求...XD");
try {
Thread.sleep((int) (Math.random() * 3000));
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
};
queue.put(request);
try {
Thread.sleep((int) (Math.random() * 3000));
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
RequestQueue queue = new RequestQueue(5);
for(int i = 0; i < 5; i++) {
(new Thread(new Client(queue))).start();
}
}
}
在这个示例中,Worker Thread有请求来了就作,如果没有请求,则所有的Worker Thread就等待,直到有新的工作进来而通知它们,取得请求的WorkerThread要作的工作,就直接定义在execute()中。
以顺序图来表示这个示例: