JAVA JDK1.5 线程池

来源:互联网 发布:c语言钩子函数 编辑:程序博客网 时间:2024/05/16 12:50

在多线程并发的条件下,由于系统资源有限,需要限制同时执行的线程的数量,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();
  }
 }

}

原创粉丝点击