concurrent学习笔记

来源:互联网 发布:德运淘宝旗舰店 编辑:程序博客网 时间:2024/05/22 17:10

newFixedThreadPool

创建一个固定大小的线程池。

shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭。

awaitTermination():用于等待子线程结束,再继续执行下面的代码。


ThreadPoolExecutor

 

newFixedThreadPool生成一个固定的线程池,顾名思义,线程池的线程是不会释放的,即使它是Idle。这就会产生性能问题,比如如果线程池的大小为200,当全部使用完毕后,所有的线程会继续留在池中,相应的内存和线程切换(while(true)+sleep循环)都会增加。如果要避免这个问题,就必须直接使用ThreadPoolExecutor()来构造。可以像Tomcat的线程池一样设置“最大线程数”、“最小线程数”和“空闲线程keepAlive的时间”。

 

 

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)  

 

corePoolSize:池中所保存的线程数,包括空闲线程(非最大同时干活的线程数)。如果池中线程数多于 corePoolSize,则这些多出的线程在空闲时间超过 keepAliveTime 时将会终止。

maximumPoolSize:线程池中最大线程数

keepAliveTime:线程空闲回收的时间

unit:keepAliveTime的单位

workQueue:保存任务的队列,可以如下选择:

 

  •   无界队列: new LinkedBlockingQueue<Runnable>();
  •   有界队列: new ArrayBlockingQueue<Runnable>(8);你不想让客户端无限的请求吃光你的CPU和内存吧,那就用有界队列

handler:当提交任务数大于队列size会抛出RejectedExecutionException,可选的值为:

 

  • ThreadPoolExecutor.CallerRunsPolicy 等待队列空闲
  • ThreadPoolExecutor.DiscardPolicy:丢弃要插入队列的任务
  • ThreadPoolExecutor.DiscardOldestPolicy:删除队头的任务

原子变量(Atomic )

并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。


原创粉丝点击