您的位置:首页 > 其它

线程池创建

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包):

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息