今天查看了java的Executor框架源码,在此记录一下,以便查阅。
(一),Executor的线程池通过ThreadPoolExecutor实现,Executors是他的工厂类,这里只说三种常用的类, 1,Executors.newSingleThreadExecutor():线程池中只有一个线程,当线程执行结束,或因为其他原因进入DEAD状态,则会再次创建一个线程供使用; 2,Executors.newFixedThreadPool(nThreads):固定数量的线程池,nThreads为线程池创建时指定的线程数量,当池中线程数量不足这个数时,如果有任务,则会新建一个线程,当线程执行结束,或因为其他原因进入DEAD状态,则会再次创建一个线程供使用; 3,Executors.newCachedThreadPool():比较智能的线程池,理论上说,没有线程池数限制,如果jvm或计算机运行,可以一直创建,当然这是不存在的,一般jvm都会有线程上限。当有新任务的时候,自动创建线程来执行,当线程执行完毕后,或因其他原因停止后,如果没有allowTimeOut限制,则会自动回收(一般是60s)。
(二)ThreadPoolExecutor是通过内部类Worker类来添加线程的,Worker类是一个Runnable对象,类中自身包含有一个Thread对象,当你在运行worker的run方法时,其实他启动的就是他本身里的Thread;
(三)说了这么多,那么多线程的原理是什么? 要知道这个,首先要明白,线程有5个状态:new,runable,running,block,dead;当新建一个线程的时候,就是new状态,当线程结束了,就是dead状态。好了,也就是说,线程活着的时候就是在:runable, running, block状态之间;
多线程的实现,也就是多线程的复用过程,也就是说要维持线程在这三个状态之间转换,如何做到呢?
刚刚说到,ThreadPoolExecutor是通过worker来添加线程的,那么在worker里的runWorker方法中,他会不断的查询workQueue(阻塞队列)来取任务执行。那么workQueue的数据时如何添加的呢?
这里写一下,当新任务来的时候,线程池的工作过程: 1,当前线程数 < corePoolSize:即当前运行的线程数,小于核心线程数量,则立即创建一个线程来执行任务;
2,当前线程数 >= corePoolSize AND workQueue未满:此时,将任务添加到workQueue里,等待处理;
3,当前线程数 >= corePoolSize AND workQueue满了 AND 当前线程数
新闻热点
疑难解答