多线程经验分享

1、ThreadLocal 简单介绍
ThreadLocal 可以允许用户在一个线程中共享变量
ThreadLocal 为解决多线程程序的并发问题提供了一种新的思路
它的具体实现是每一个线程都新建一个ThreadLocalMap对象,KEY为线程,VALUE为需要共享的值。而不是共享一个静态MAP对象来实现,这样的好处方便GC回收。

2、ThreadPoolExecutor 简单介绍
public ThreadPoolExecutor(int corePoolSize, 
                          int maximumPoolSize, 
                         long keepAliveTime, 
                          TimeUnit unit, 
                         BlockingQueue<Runnable> workQueue, 
                          ThreadFactory threadFactory, 
                          RejectedExecutionHandler handler)
corePoolSize 核心线程池大小
maximumPoolSize 最大线程池大小
keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit keepAliveTime时间单位
workQueue 阻塞任务队列
threadFactory 新建线程工厂
RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理;

1. 当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2. 当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
3. 当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
4. 当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
5. 当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
6. 当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、
MICROSECONDS、
MILLISECONDS、
SECONDS。

handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常

ThreadPoolExecutor.CallerRunsPolicy()
当抛出RejectedExecutionException异常时,会调用rejectedExecution方法
(如果主线程没有关闭,则主线程调用run方法,源码如下
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                r.run();
            }
        }
)

ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务

ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务

你可能感兴趣的:(多线程)