这个模型也称为背景线程。把工作交个被人,让别人启动一个线程做交给的任务,自己继续做自己的事,这是Thread Per Message。而在Worker Thread中,任务交给别人后,并不是每次都开启一个线程,而是不断的重复利用已有的线程。事实上开启一个线程是很耗费时间的工作。
实例中:Request是委托者,它有execute功能。WorkThread不断的从队列中获取Request,然后让Request执行。ClientThread不断的向队列中添加Request。而“队列”Channel中,如果满了,添加会等待,如果空了,获取会等待。Channel中有一列WorkThread,用来不断的获取Request。这个实例中请求者和工人数量都是多个的。
ClientThread不断的请求新任务,Channel里面的几个WorkerThread不断的解决请求。
import java.util.Random;
public class Request {
private final String name; //委托者
private final int number; //请求编号
private static final Random random=new Random();
public Request (String name,int number){
this.name=name;
this.number=number;
}
public void execute(){
System.out.println(Thread.currentThread().getName()+" executes "+this);
try{
Thread.sleep(random.nextInt(1000));
}catch(InterruptedException e){
e.printStackTrace();
}
}
public String toString(){
return " [Request from "+name +" No."+number+"]";
}
}
import java.util.Random;
public class ClientThread extends Thread{
private final Channel channel;
private static final Random random=new Random();
public ClientThread(String name,Channel channel){
super(name);
this.channel=channel;
}
public void run(){
try{
for(int i=0;true;i++){
Request request=new Request(getName(),i);
channel.putRequest(request);
Thread.sleep(random.nextInt(1000));
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class WorkerThread extends Thread{
private final Channel channel;
public WorkerThread(String name,Channel channel){
super(name);
this.channel=channel;
}
public void run(){
while(true){
Request request=channel.takeRequest();
request.execute();
}
}
}
public class Channel {
private static final int MAX_REQUEST=100;
private final Request[] requestQueue;
private int tail; //下一个putRequest
private int head; //下一个takeRequest
private int count; //Request的数量
private final WorkerThread[] threadPool;
public Channel(int threads){
this.requestQueue=new Request[MAX_REQUEST];
this.head=0;
this.tail=0;
this.count=0;
threadPool=new WorkerThread[threads];
for(int i=0;i<threadPool.length;i++){
threadPool[i]=new WorkerThread("Worker-"+i,this);
}
}
public synchronized void startWorkers(){
for(int i=0;i<threadPool.length;i++){
threadPool[i].start();
}
}
public synchronized void putRequest(Request request){
while(count>=requestQueue.length){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
requestQueue[tail]=request;
tail=(tail+1)%requestQueue.length;
count++;
notifyAll();
}
public synchronized Request takeRequest(){
while(count<=0){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
Request request=requestQueue[head];
head=(head+1)%requestQueue.length;
count--;
notifyAll();
return request;
}
}
public class Main {
public static void main(String[] args){
Channel channel=new Channel(5);
channel.startWorkers();
new ClientThread("Alice",channel).start();
new ClientThread("Bobby",channel).start();
new ClientThread("Chris",channel).start();
}
}
运行结果:
Worker-3 executes [Request from Alice No.0]
Worker-1 executes [Request from Bobby No.0]
Worker-0 executes [Request from Chris No.0]
Worker-4 executes [Request from Chris No.1]
Worker-2 executes [Request from Alice No.1]
Worker-4 executes [Request from Chris No.2]
Worker-0 executes [Request from Alice No.2]
Worker-3 executes [Request from Bobby No.1]
Worker-1 executes [Request from Alice No.3]
Worker-4 executes [Request from Bobby No.2]
Worker-2 executes [Request from Alice No.4]
Worker-4 executes [Request from Chris No.3]
Worker-3 executes [Request from Bobby No.3]
Worker-3 executes [Request from Alice No.5]
Worker-0 executes [Request from Alice No.6]
Worker-0 executes [Request from Alice No.7]
Worker-1 executes [Request from Alice No.8]
Worker-0 executes [Request from Chris No.4]
Worker-4 executes [Request from Bobby No.4]
Worker-0 executes [Request from Alice No.9]
Worker-1 executes [Request from Chris No.5]
Worker-2 executes [Request from Chris No.6]
Worker-0 executes [Request from Alice No.10]
。。。