在多线程并发的条件下,由于系统资源有限,需要限制同时执行的线程的数量,JDK1.5提供了线程池来控制多线程的执行。
JDK1.5中的线程池包含以下三种:
1.newSingleThreadExecutor:创建一个单线程的线程池,这个线程池最多只有一个线程在执行,也就是相当于单线程串行执行
2.newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3.newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60 秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
实际项目中用得最多的线程池是newFixedThreadPool。
线程池中的参数:
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
largestPoolSize:线程池同时执行过的最大线程数
activeCount:当前正在执行的线程数量
poolSize :线程池中的线程数
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
queue:线程池中的队列
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
taskCount:被加入到线程池的线程数,包括未执行,正在执行和已经执行完成
completedTaskCount:线程池已经执行完的线程数
newFixedThreadPool线程池的例子如下:
public class MyThread implements Runnable {
public void run() {
try {
System.out.println(new Date().toLocaleString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ThreadPoolExample {
private int maxPoolSize = 10;
private ThreadPoolExecutor threadPoolExecutor;
public ThreadPoolExample(){
threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(maxPoolSize);
}
public void executeThread(Runnable runnable){
threadPoolExecutor.execute(runnable);
}
public void execute(Runnable runnable){
threadPoolExecutor.execute(runnable);
}
public void print(){
System.out.println("ActiveCount="+threadPoolExecutor.getActiveCount());
System.out.println("MaximumPoolSize="+threadPoolExecutor.getMaximumPoolSize());
System.out.println("LargestPoolSize="+threadPoolExecutor.getLargestPoolSize());
System.out.println("CorePoolSize="+threadPoolExecutor.getCorePoolSize());
System.out.println("PoolSize="+threadPoolExecutor.getPoolSize());
System.out.println("QueueSize="+threadPoolExecutor.getQueue().size());
System.out.println("TaskCount="+threadPoolExecutor.getTaskCount());
System.out.println("CompletedTaskCount="+threadPoolExecutor.getCompletedTaskCount());
}
public static void main(String[] args) {
ThreadPoolExample threadPoolExample = new ThreadPoolExample();
for (int i = 0; i < 100; i++) {
threadPoolExample.execute(new MyThread());
}
try {
Thread.sleep(90);
threadPoolExample.print();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}