线程池

WHAT

线程池是一种池化技术,初始化时创建一定数量的线程放入池中,当外界请求调用线程时,直接从池中取出可用线程进行业务处理,用完放回池中。

 

WHY

线程池因为在初始时创建了一定数量的线程,这样省略了创建线程的开销,对于高并发需求来说,对于提高性能、减少系统CPU的计算开销,大有好处。

线程池

特别是针对应用请求来得急,要求处理快场景,如果每一个请求创建一个新线程则导致性能问题。

线程池

 

HOW

线程池有各种语言实现,此处是JAVA语言版本:

 

/**
 * 线程池
 */
public class ThreadPool {
	int maxCounts;												// 线程池最大数量
	Vector<Runnable> container;									// 线程容器
	
	public ThreadPool(int maxCounts){
		this.maxCounts = maxCounts;
		container = new Vector(maxCounts);
		for(int i=0;i<container.capacity();i++){
			WorkThread wt = new WorkThread();
			container.add(wt);
			wt.start();
		}
	}
	
	/**
	 * 处理请求
	 */
	public void processReq(String args){
		int i;
		/**  轮询空闲线程,找出来干活  */
		for(i=0;i<container.capacity();i++){
			WorkThread wt = (WorkThread) container.get(i);
			if(!wt.isBusy()){
				System.out.println(wt.getId() + "线程正闲着,开始接客" + args);
				wt.setBusy(true);
				wt.setArgs(args);
				System.out.println(wt.getId() + "线程接完客" + args + ",开始休息");
				break;
			}
		}
		if(i == container.capacity()){
			System.out.println("各线程都在忙着,请稍等");
		}
	}
}

/**
 * 工作线程
 */
class WorkThread extends Thread{
	
	/** 是否忙碌 */
	private boolean isBusy;
	
	/** 接收到的参数  */
	private String args;

	public String getArgs() {
		return args;
	}

	public void setArgs(String args) {
		this.args = args;
	}

	public boolean isBusy() {
		return isBusy;
	}

	/**
	 * 设置是否忙碌状态
	 * @param isBusy
	 */
	public synchronized void setBusy(boolean isBusy) {
		this.isBusy = isBusy;
		/**  线程忙碌时,唤醒  */
		if(isBusy){
			notify();
		}
	}

	/**
	 * run片断也要同步,不然报current thread not owner异常
	 */
	public synchronized void run(){
		while(true){
			if(isBusy()){
				System.out.println(this.getId() + "工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟");
				try {
					sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				setBusy(false);
			} else {
				try {
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 测试类:

 

import java.util.Scanner;

public class PoolTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str;
		Scanner scan = new Scanner(System.in);
		// CPU数量+1
		ThreadPool pool = new ThreadPool(3);
		while(true){
			str = scan.nextLine();
			pool.processReq(str);
		}
	}
}

 输出结果:

 

test
8线程正闲着,开始接客test
8线程接完客test,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
111
8线程正闲着,开始接客111
8线程接完客111,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
testi
9线程正闲着,开始接客testi
9工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
9线程接完客testi,开始休息
ooooo
8线程正闲着,开始接客ooooo
8线程接完客ooooo,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
ieie
10线程正闲着,开始接客ieie
10线程接完客ieie,开始休息
10工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
oad
9线程正闲着,开始接客oad
9线程接完客oad,开始休息
9工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
iad
各线程都在忙着,请稍等
iiii
8线程正闲着,开始接客iiii
8线程接完客iiii,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟

参考文献:

1. http://www.ibm.com/developerworks/cn/java/j-jtp0730/

2. http://blog.csdn.net/zikwang/article/details/2245496

你可能感兴趣的:(线程池)