ThreadPoolExecutor-兑现自定义线程池

ThreadPoolExecutor-实现自定义线程池

 

自定义连接池稍微麻烦些,不过通过创建的ThreadPoolExecutor线程池对象,可以获取到当前线程池的尺寸、正在执行任务的线程数、工作队列等等.

 

下面创建一个执行任务类继承至Thread类,也可以实现Runnable接口,效果一样.

package pack.java.custom;
/**
 * 执行任务;
 * @author zhouhaitao
 * 2012-4-11
 */
public class RunnableTask extends Thread{
	//线程数;
	private int i = 0;

	public RunnableTask(){
		super();
	}

	public RunnableTask(int num){
		i = num ;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i =0;i<3;i++){
			System.out.println(i);
		}
		System.out.println("线程"+i+"执行完成.");
	}
}

 

 

创建一个测试自定义线程池的类,具体代码如下:

package pack.java.custom;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 自定义线程池;
 * @author zhouhaitao
 * 2012-4-11
 */
public class CustomThreadPool {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//创建等待队列;
		BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<Runnable>(20);
		
		//创建一个单线程执行程序,它可以安排在指定的时间执行或者定期执行;
		ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 2, TimeUnit.MILLISECONDS, blockingQueue);
		Thread thread1 = new RunnableTask(1);
		Thread thread2 = new RunnableTask(2);
		Thread thread3 = new RunnableTask(3);
		pool.execute(thread1);
		pool.execute(thread2);
		pool.execute(thread3);
		
		//关闭线程池;
		pool.shutdown();
	}
}

 

 

执行结果:

----------------------------------------------------

0
1
2
线程1执行完成.
0
1
2
线程3执行完成.
0
1
2
线程2执行完成.

 

ThreadPoolExecutor构造方法参数介绍:


public ThreadPoolExecutor(int corePoolSize,  
                          int maximumPoolSize,  
                          long keepAliveTime,  
                          TimeUnit unit,  
                          BlockingQueue<Runnable> workQueue)
用给定的初始参数和默认的线程工厂及处理程序创建新的 ThreadPoolExecutor。
使用 Executors 工厂方法之一比使用此通用构造方法方便得多。 

 
参数:   
corePoolSize - 池中所保存的线程数,包括空闲线程。   
maximumPoolSize - 池中允许的最大线程数。   
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。   
unit - keepAliveTime 参数的时间单位。   
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。   
抛出:   
IllegalArgumentException - 如果 corePoolSize 或 keepAliveTime 小于零,
或者 maximumPoolSize 小于或等于零,或者 corePoolSize 大于 maximumPoolSize。   
NullPointerException - 如果 workQueue 为 null 

 

 

引用:

http://longzhun.iteye.com/blog/1404836