Worker Thread

        这个模型也称为背景线程。把工作交个被人,让别人启动一个线程做交给的任务,自己继续做自己的事,这是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]

。。。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值