如果提交任务时,线程池队列已满,这时会发生什么?
许多程序员会认为该任务会阻塞直到线程池队列有空位。事实上如果一个任务不能被调度执 行那么 ThreadPoolExecutor’s submit()方法将会抛出一个 RejectedExecutionException 异常。
什么是线程局部变量?
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。
使用 volatile 关键字的场景?
synchronized 关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile 关键字在某些情况下性能要优于 synchronized,但是要注意 volatile 关键字是无法替代synchronized 关键字的,因为volatile 关键字无法保证操作的原子性。通常来说,使用volatile 必须具备以下 2 个条件:
1) 对变量的写操作不依赖于当前值
2) 该变量没有包含在具有其他变量的不变式中
线程池的工作原理,几个重要参数?
ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTi me,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
参数说明:
corePoolSize 核心线程数
maximumPoolSize 最大线程数,一般大于等于核心线程数
keepAliveTime 线程存活时间(针对最大线程数大于核心线程数时,非核心线程) unit 存活时间单位,和线程存活时间配套使用
workQueue 任务队列threadFactory 创建线程的工程handler 拒绝策略
线程池的类型?
五种线程池:
ExecutorService threadPool = null;
threadPool = Executors.newCachedThreadPool();//有缓冲的线程池,线程数 JVM 控制
threadPool = Executors.newFixedThreadPool(3);//固定大小的线程池threadPool = Executors.newScheduledThreadPool(2);
threadPool = Executors.newSingleThreadExecutor();//单线程的线程池,只有一个线程在工作
threadPool = new ThreadPoolExecutor();//默认线程池,可控制参数比较多