java线程池

java线程池分析和使用参考链接:http://ifeve.com/java-threadpool/

java线程池原理和源码解析链接:http://ifeve.com/java-threadpoolexecutor/

java自带线程池和队列详细讲解:http://www.oschina.net/question/565065_86540

1.线程池有什么作用?

线程池简单说就是控制jvm中的线程数量,不会让jvm因为创建太多的线程而奔溃。而对于创建一个指定线程数量的线程池,即便一个任务需要20个线程来完成的任务,线程池也会控制同一时刻执行线程的数量,内部封装线程的排队机制,简化了开发者管理线程的方式。

2.一个线程池,针对不同线程的不同实例,是如何管理的?

如线程A的实例a1,和线程B的实例b1,都是由线程池pool管理的,那么a1、b1运行完后如何处理?

线程池中运行的线程任务对象,都实现了Runnable接口(或Callable接口),单独实例化Runnable,其实线程是没有启动的,这点大家都知道。只有将Runnable实例提交给一个Thread,然后调用thread.start()方法,Runnable的任务才开始异步执行。同理,线程池中的线程与Runnable的实例无关,对于实例a1、b1都是Runnable接口的子类,都能提交个pool执行。实际使用时,如果是一个相对较小的项目,一个线程池就可以管理所有的运行线程;而对于一个复杂的项目,使用多个线程池管理对应任务的实例也是可以的。

3.对于大批量操作,采用多个线程分治的思想处理,一定要用线程池吗?

对于大批量任务,采用分治的思想处理任务,比较难把握的一点,就是任务到底有多大。比如大批量插入数据,这个大批量可能是1k条,可能是1w条,也可能是几十w条,那么分治处理的线程也可能会批量增长。如果我500条插入为一个子任务,那么插入1k条只要2个线程,而插入10w条就要200个线程,会造成线程暴增,很可能造成系统风险,那么用一个20线程的线程池来管理这200个线程,就不至于撑爆jvm。所以分治任务最好用线程池对线程数进行控制。

4.一个系统中能用多个线程池管理不同的线程实例吗?

当然是可以的。只是要注意控制线程的总数量。

5.java中的常用线程池

java中的常用线程池,原理+实例,参考链接:java自带线程池和队列详细讲解

下面总个简单概括:

java中真正的线程池类是ExecutorService,其默认实现ThreadPoolExecutor。创建一个线程池,用ThreadPoolExecutor的构造方法来实现。

至于ThreadPoolExecutor的构造方法参数,和具体含义不重复了,参考链接:java线程池分析和使用参考链接

为了简化java线程池的创建,jdk提供了Executors类的一些静态方法来实现线程池创建的模板:

1)ExecutorService pool = Executors. newSingleThreadExecutor():创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务
2)ExecutorService pool = Executors.newFixedThreadPool(2):创建固定大小的线程池。
3)ExecutorService pool = Executors.newCachedThreadPool():创建一个可缓存的线程池。线程大小数量不限,直到撑爆jvm。
4)ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

上面这些模板的使用示例可参考java自带线程池和队列详细讲解

5)还有一个不是线程池,当跟线程池绑定使用的:CompletionService。CompletionService准确来说不是线程池,其是配合一个指定的线程池,来获取一堆线程执行后的结果集,且内部已经实现了完成线程与未完成线程结果集的分离。这个功能接口是:CompletionService,其实现子类是ExecutorCompletionService。

具体用法可以参考CompletionService示例:java.util.concurrent包下个几个常用类

6)Fork/Join框架。上面的都是jdk1.6及以下支持的功能。jdk1.7扩展了新功能。

Fork/Join就说来话长了。基本意思就是:这个框架被设计用来解决可以使用分而治之技术将任务分解成更小的问题。在一个任务中,检查你想要解决问题的大小,如果它大于一个既定的大小,把它分解成更小的任务,然后用这个框架来执行。
具体可以参考:Fork/Join框架引言  和  java.util.concurrent包下的Fork/Join框架

你可能感兴趣的:(java,并发,线程池,concurrent,ForkJoinPool,java,concurrent,forkjoinpool)