线程池创建
2017-06-20 13:57
204 查看
简单来说使用线程池有三个好处:
1、降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2、提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行。
3、提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、
调优和监控。
一般情况下会使用Executors创建线程池,目前不推荐,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor方式,这样的处理方式可
以更加明确线程池的运行规则,规避资源耗尽的风险。
1、newFixedThreadPool和newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM
2、newCachedThreadPool和newScheduledThreadPool: 主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚
至OOM
推荐方式1(使用了com.google.guava包):
调用execute(Runnable task)方法即可
关于线程池的分析和参考请参考:http://ifeve.com/java-threadpool/
关于线程池和线程相关的详细介绍可参考:http://www.cnblogs.com/dolphin0520/p/3932921.html
1、降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2、提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行。
3、提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、
调优和监控。
一般情况下会使用Executors创建线程池,目前不推荐,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor方式,这样的处理方式可
以更加明确线程池的运行规则,规避资源耗尽的风险。
1、newFixedThreadPool和newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM
2、newCachedThreadPool和newScheduledThreadPool: 主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚
至OOM
推荐方式1(使用了com.google.guava包):
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("demo-pool-%d").build(); ExecutorService executorService = new ThreadPoolExecutor(5, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());推荐方式2(使用了commons-lang3包):
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1, new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());推荐方式3(spring配置线程池方式):自定义线程工厂bean需要实现ThreadFactory,可参考该接口的其它默认实现类,使用方式直接注入bean
调用execute(Runnable task)方法即可
<!-- 添加默认实现 --> <bean id="threadFactory" class="java.util.concurrent.Executors$DefaultThreadFactory"/> <!-- 添加自定义实现 --> <bean id="threadFactoryNew" class="com.fc.provider.ThreadFactoryConsumer"/> <!-- 创建线程池 --> <bean id="userThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5" /> <property name="maxPoolSize" value="50" /> <property name="queueCapacity" value="1000" /> <property name="keepAliveSeconds" value="3000"/> <property name="threadFactory" ref="threadFactoryNew"/> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> </property> </bean>一个完整示例如下:
public class ThreadPoolDemo { /** * 定义静态内部线程类 */ public static class MyTask implements Runnable { @Override public void run() { System.out.println(System.currentTimeMillis() + ":Thread name:" + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * @param args */ public static void main(String[] args) { MyTask myTask = new MyTask(); ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("demo-pool-%d").build(); ExecutorService executorService = new ThreadPoolExecutor(5, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); for (int i = 0; i < 10; i++) { executorService.execute(myTask); } executorService.shutdown(); } }
关于线程池的分析和参考请参考:http://ifeve.com/java-threadpool/
关于线程池和线程相关的详细介绍可参考:http://www.cnblogs.com/dolphin0520/p/3932921.html
相关文章推荐
- 线程池原理及创建(C++实现)
- 创建线程池的一种方式
- [转]使用VC/MFC创建一个线程池
- Executors 工具类 创建 的 线程池
- 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
- 线程池原理及创建(C++实现)
- Java中Executors类中几种创建各类型线程池的方法及实例
- 基础篇:线程的创建与线程池的使用(一)
- JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法
- ThreadPoolTaskExecutor 创建线程池管理
- 关于如何创建线程池
- java创建线程池
- java的Executors类中创建线程池方法的解析
- Java 多线程池ThreadPoolExecutor解析及Executors类中提供的静态方法来创建线程池
- ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
- 使用新的java线程池技术创建固定的线程去完成任务,都完成后计算总时间
- 线程池原理及创建(C++实现)
- 如何创建Java中的线程池
- 类工厂Executors工厂类创建线程池的底层实现
- 线程池的创建与使用