自定义连接池稍微麻烦些,不过通过创建的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
引用: