常见问题之线程池
-
为什么要用线程池
1.降低资源消耗:通过重用已经创建的线程来降低线程创建和销毁的消耗
2.提高响应速度:任务到达时不需要等待线程创建就可以立即执行
3.提高线程的可管理性:线程池可以统一管理、分配、调优和监控 -
线程的四种创建方式
1.Executors.newFixedThreadPool 创建一个coreSize=maxSize=n的线程池,每个线程不限制空闲时间,一直阻塞等待任务(LinkedBlockingQueue)
2. Executors.newCachedThreadPool 创建一个coreSize=0, maxSize=Integer.MAX_VALUE, 每个线程最大空闲时间不能超过60s,否则强制退出(SynchronousQueue)
3. Executors.newSingleThreadExecutor 创建一个coreSize=maxSize=1的线程池,每个线程不限制空闲时间,一直阻塞等待任务,不存在并发,保证任务有序执行完(LinkedBlockingQueue)
4. Executors.newScheduledThreadPool 创建一个coreSize=0, maxSize=Integer.MAX_VALUE,每个线程空闲时间设置0,否则强制退出(DelayedWorkQueue) -
线程池的重要参数
1.allowCoreThreadTimeOut 指定核心线程是否允许超时,非核心线程写死在代码里面一定是有空闲时间限制的boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
2 .keepAliveTime 指定核心线程或者非核心线程的最大空闲时间
3.corePoolSize 指定核心线程数量
4.maximumPoolSize 指定最大线程数量
5.RejectedExecutionHandler 指定使用的拒绝策略(AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy)
6.ThreadFactory 指定创建线程的工厂实现