一、功能:建立干活线程对象全部放入线程池中,驱动线程不用我们写了,这个线程池应该会自己去建立驱动线程
1、Executor:
1》管理 干活线程 对象
2》以前(new Thread 驱动线程)来驱动干活线程干活。
3》现在不需要建立驱动干活线程了,建立好干活线程后,直接交给Executor来管理。
对象(方法)------干活线程------驱动线程--executor
2、 Executors:产生Executor对象的工厂,由Executors来决定用Executor的哪一种类型。
Executor,ExecutorService ,ThreadPoolExecutor :属于同一类型
1》Executor:是一个接口,它的实现类是ThreadPoolExecutor ,由Executors的静态方法去调用实现类。
2》建立Executor对象时,为什么不直接使用使用 new ThreadPoolExecutor 呢?
3》而又加一层Executors,通过Executors去建立ThreadPoolExecutor 对象呢?
ExecutorService exec = Executors.newSingleThreadExecutor();
ExecutorService:就是在Executor 的基础上加了一些功能。
答案:也许还是用java经常谈的Factory模式,即所有新建的对象放在一个工厂(Executors)里建立。
因为Executor可以有多种对象,根据池子的能放干活线程的多少分成以下三种,
Executor的种类:CachedThreadPool,FixedThreadPool,SingleThreadExecutor
二、池子能放多少线程的几种规定
1、CachedThreadPool :池子可以放许多线程 ,个数不限制。
package concurrency; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CachedThreadPool { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) exec.execute(new LiftOff()); exec.shutdown(); } } //Very often, a single Executor can be used to create and manage all the tasks in your system:一个Executor 对象能管理所有对象的任务。 |
方法:ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
功能:1》在缓冲区建立一个池子,放新的干活线程,但要用干活线程时先去池子里找,有,就用上,没有,就建立一个新干活线程扔到池子里。
2》如果在一个线程池里的线程60秒不用,则从池中删除此线程。
2、FixedThreadPool: 池中只能放几个固定的干活线程数,当建立Executor对象时就定义好。
例子:线程池每次只允许5个干活线程。
package concurrency; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FixedThreadPool { public static void main(String[] args) { // Constructor argument is number of threads: ExecutorService exec = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; i++) exec.execute(new LiftOff()); exec.shutdown(); } } |
3、SingleThreadExecutor:这下好,池子放的干活线程数,越来越少了,一个池子只放一个干活线程。
主要是一个任务完成后,才调用下一个任务,哪么要线程池干吗?以前对象也是这样执行的?不懂????
package concurrency; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SingleThreadExecutor { public static void main(String[] args) { ExecutorService exec = Executors.newSingleThreadExecutor(); for (int i = 0; i < 5; i++) exec.execute(new LiftOff()); exec.shutdown(); } } |
参考文章:http://www.cnblogs.com/MOBIN/p/5436482.html