ThreadPoolExecute类:构造器中各个参数的含义
corePoolSize:核心池的大小。
在创建了线程池之后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了怕restartAllCoreThreads()或者prestartCoreThread()方法,从这两个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目 达到corePoolSize后,就会把到达的任务放到缓存队列当中
maximumPoolSize:线程池最大线程数,这个参数也是一个非常重要的参数,他表示在线程池中最多能创建多少个线程
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。
默认情况下 ,只有线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会停止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadOut(boolean )方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0
unit :参数keepAliveTime的时间单位,有7种取值,在timeUnit类中有7中静态属性:
TimeUnit.DAYS; //天
TimeUnit.HOURS; //小时
TimeUnit.MINUTES; //分钟
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS;//毫秒
TimeUnit.MICROSECONDS;//微秒
TimeUnit.NANOSECONDS;//纳秒
workQueue:一个阻塞队列,用来存储等待执行任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择:
ArrayBlockingQueue;
LinkedBlockingQueue;
SynchronousQueue;
//其中ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与BlockingQueue有关
创建一个线程池:
ThreadPoolExecutor executor=new threadPoolExecutor(5,10,200,TimeUnit.SECONDS,new LinkedBlockingDeque(5));
//执行一个任务:
executor.execute(myrun);
execute()//方法实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法
//是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。
关闭线程池
exeecutor.shutdown();
shutdown();//不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但在也不会接受新的任务;
shutdownNow();//立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务;
几个方法的说明:
executor.getPoolSize()-----获取线程池中的线程数目
executor.getQueue().size()----获取等待线程的数目
executor.getCompletedTaskCount()---已执行完的线程数目
seetCorePoolSize:---设置核心池大小
setMaximumPoolSize:---设置线程池最大能创建的线程数目大小
Executors:
还可以使用Executors类中提供的几个静态方法来创建线程池:
Executors.newCachedThreadPool();//创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE
Executors.newSingleThreadExecutor();//创建容量为1的缓冲池
Executors.newFixedThreadPool(int);//创建固定容量大小的缓冲池
//它们实际上也是调用了ThreadPoolExecutor,只不过参数都已配置好了。
newFixedThreadPool创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;
newSingleThreadExecutor将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue;
newCachedThreadPool将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。
实际上,如果Executors提供的三个静态方法能满足要求,就尽量使用它提供的三个方法,因为自己动手去配置ThreadPoolExecutor的参数有点麻烦,要根据实际任务的类型和数量来进行配置。