`
qq466862016
  • 浏览: 125685 次
  • 来自: 杭州
社区版块
存档分类
最新评论

Java多线程-自己动手写个线程池

阅读更多
package pool;

public interface Request {

	
	public void execute();
}

 

package pool;

public class HttpRequest  implements Request {

	private String name;
	
	
	public HttpRequest(String name) {
		super();
		this.name = name;
	}


	@Override
	public void execute() {
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.err.println(Thread.currentThread().getName() + " 我执行了" + name + ".....");
	}

}

 

package pool;

import java.util.LinkedList;
import java.util.Queue;

public class PoolManager {

	
	private int maxSize;
	private int maxTaskSize;
	private LinkedList<WorkThread> workThreads = new LinkedList<WorkThread>();
	private TaskQueue queue;
	
	public PoolManager(int maxSize,int maxTaskSize) {
		this.maxSize = maxSize;
		this.maxTaskSize = maxTaskSize;
		this.init();
	}
	
	private void init(){
		
		queue = new TaskQueue(maxTaskSize);
		
		for (int i = 0; i < maxSize; i++) {
			WorkThread workThread = new WorkThread("工作线程" + i ,queue);
			workThreads.add(workThread);
		}
	}
	
	public void start() {
		
		for (WorkThread workThread : workThreads) {
			workThread.start();
		}
	}
	
	
	public void execute(Request request) {
		
		queue.addTask(request);
		
	}
	
}

 

package pool;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class TaskQueue {

	private  int maxSize;
	private Queue<Request> queue = new ConcurrentLinkedQueue<Request>();
	public TaskQueue(int maxSize) {
		super();
		this.maxSize = maxSize;
	}
	
	
	public void addTask(Request request) {
		
		synchronized (this) {
			while(queue.size() >= maxSize) {
				try {
					System.err.println("任务队列已经满了。。。。。");
					this.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.err.println("添加新任务到任务队列中。。。。");
			queue.add(request);
			this.notifyAll();
			
		}
	}
	
	
	
	public Request getTask() {
		synchronized (this) {
			
			while (queue.size() == 0) {
				
				try {
					System.err.println("当前任务队列为空.....");
					this.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			
			 Request request = queue.poll();
			 this.notifyAll();
			 return request;
		}
	}
}

 

package pool;

public class WorkThread extends Thread {

	
	private TaskQueue  queue;
	private boolean used = false;
	
	
	public boolean isUsed() {
		return used;
	}


	public WorkThread(String name,TaskQueue queue) {
		this.queue = queue;
		this.setName(name);
	}


	@Override
	public void run() {
		while (true) {
			used = true;
			Request task = queue.getTask();
			task.execute();
			used = false;
			
		}
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics