Executor与线程池_ExecutorService与CompletionService

Executor与线程池_ExecutorService与CompletionService_第1张图片
创建的是缓存线程池

使用线程池的好处

1.降低资源消耗(复用线程) 2.提高响应速度(不需要创建线程) 3.提高线程的可管理性

线程池的几个参数

1.corePoolSize(核心线程池基本大小) 2.maxmumPoolSize(线程池最大线程数)

3.keepAliveTime(线程活动保持时间),4.TimeUnit(线程活动保持时间的单位,day-nanos)

5.runnableTaskQueue(工作队列) ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,PriorityBlockingQueue

6.RejectedExecutionHandler(饱和策咯)

AbortPolicy直接抛出异常,CallerRunsPolicy只用调用者所在线程来运行任务,DiscardOldestPolicy丢弃队列里最近的一个任务,执行当前任务;DiscardPolicy不处理,丢弃

Executor与线程池_ExecutorService与CompletionService_第2张图片

固定线程池,0L,则任务完成后立刻删除,那么仍然需要创建线程,则怎么复用? 还是先判断任务队列没job再丢弃?

Executor与线程池_ExecutorService与CompletionService_第3张图片
Executor与线程池_ExecutorService与CompletionService_第4张图片
Executor与线程池_ExecutorService与CompletionService_第5张图片
线程池流程

配置线程池大小: 可通过Runtime.getRuntime().availableProcessors()获得当前CPU数

1.CPU密集型--N(cpu)+1;2.IO密集型--2*N(cpu)

使用线程池不仅可以提高应用的响应时间,还可以避免"java.lang.OutOfMemoryError: unable to create new native thread"之类的错误。

建议设置为有界队列

StackOverflowError是由于当前线程的栈满了 那么二者有什么区别?

线程池监控

taskCount:线程池需要执行的任务数量

completedTaskCount:线程池在运行过程中已完成的任务数量

largestPoolSize:线程池曾创建过的最大线程数量

getPoolSize:线程池的线程数量

getActiveCount:活动的线程数


Executor


Executor, ExecutorService 和 Executors 间的不同

你可能感兴趣的:(Executor与线程池_ExecutorService与CompletionService)