线程局部变量
线程局部变量高效的为每个使用它的线程提供单独的线程局部变量副本,每个线程只能看到与自己联系的值,而不知道其他线程可能正在使用或者修改的值。Java编译器并不为线程局部变量提供特别的语言支持,而是使用一个ThreadLocal类来实现这些支持。
因为线程局部变量是用类来实现的而不是java语言的一部分,所以想要使用线程局部变量需要先实例化ThreadLoacl的一个对象,ThreadLocal充当检索,存储一个值时的句柄。
线程池参数
最常用的线程池实现ThreadPoolExecutor,它有四个构造函数,前三个构造函数都是调用了第四个。
public ThreadPoolExecutor(int corePoolSize, int maxmumPoolSize, long keepAliveTime, Timeunit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
共有七个参数:
**corePoolSize:**表示核心线程数。线程池创建完成后,里面默认没有线程,有任务到来后才会创建线程执行任务,到线程数量等于corePoolSize,新到来的任务就会放入缓存队列中。
**maxmumPoolSize:**当核心线程数量已满,且缓存队列已满时,线程池就会创建新的线程,直到线程数量为maxmumPoolSize。此后若仍有任务到来,线程池会拒绝任务并且抛出异常。
**keepAliveTime:**当线程的空闲时间达到keepAliveTime,该线程就会退出,直到线程数量为corePoolSize。
**Timeunit:**keepAliveTime的单位。
**BlockingQueue:**阻塞队列,存储等待执行的任务。
**ThreadFactory:**线程工厂,用于创建线程。
**RejectedExecutionHandler:**队列已满,且线程数量为最大线程数量的异常处理策略。有如下几种策略:
ThreadPoolExecutor.AbortPolicy 丢弃任务,抛出RejectedExecutionException异常;
ThreadPoolExecutor.DiscardPolicy 丢弃任务,不抛出异常;
ThreadPoolExecutor.DiscardOldestPolicy 丢掉队列最前面的任务,重新执行此任务(反复);
ThreadPoolExecutor.CallerRunsPolicy 由调用线程处理该任务