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