首页 > 学院 > 开发设计 > 正文

多线程原理--学习笔记

2019-11-11 05:13:45
字体:
来源:转载
供稿:网友

今天查看了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 当前线程数


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表