线程池的创建、执行和关闭

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的参数有点麻烦,要根据实际任务的类型和数量来进行配置。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值