线程池
来源:互联网 发布:ipython 源码安装 编辑:程序博客网 时间:2024/05/17 08:19
这部分学一下线程池,我猜这个应该是安卓经常用到的吧,java最多只听说个连接池,没办法为了应付面试官,咬着牙硬着头皮上吧。看这个需要和视频一起
理解,网上的文章都是抄来抄去,内容又写的 实在垃圾。http://pan.baidu.com/share/home?uk=1430229596#category/type=0
这个里面ScheduledThreadPoolExecutor是周期性的执行任务调度,不知道为啥没人研究它,我也找不到资料,不管了。
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
Executors是java线程池的工厂类,通过它可以快速初始化一个符合业务需求的线程池,如Executors.newFixedThreadPool 方法可以生成一个拥有固定线程数的线程池。
ExecuteService默认的实现是ThreadPoolExecutor,它的构造方法是这样的:
public ThreadPoolExecutor(intcorePoolSize,//核心池的大小
int maximumPoolSize,//最大线程数
long keepAliveTime,//保持存活的时间
TimeUnitunit,
BlockingQueue<Runnable> workQueue,
ThreadFactorythreadFactory) {//线程的工厂
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
一个任务进来,首先找工作线程,3个橙色的工作线程肯定 不能找,只能找剩余的2个空闲线程。
一个深红色的任务进来了,发现工作线程满了,它就在任务队列里面开始排队,和买票是一样的。如果哪个线程闲下来了,就可以从任务对
列中出来。
工作线程满了,队列也满了,那队都开始排不上了。开临时线程,和临时工一样,不忙的时候就把他开除掉。
因为用ThreadPoolExecutor的构造方法去创建线程池比较麻烦,很多程序员都可能搞不定,所以SUN就创建了一个Executors,里面提供了4个静态的工厂,能生成4种常用的线程池。
public static ExecutorService newSingleThreadExecutor()单线程
public static ExecutorService newFixedThreadPool固定大小
public static ExecutorService newCachedThreadPool()是来弥补newFixedThreadPool的缺点的,当线程池里面的不够时,能智能的添加新线程来处理任务。也叫不固定大小的线程池
public static ScheduledExecutorService newScheduledThreadPool大小无限制,并且还能周期性的执行,和newCacheThreadPool多了一个时间的控制,用那个瞬间就执行完了,用这个还能每个线程执行完了隔多长时间别的线程接着跑
2.任务队列,线程池里面最最要的概念,把线程放在里面,线程从这个里面把任务取出来,原子操作,不能同时多个线程进来取
通知机制,任务队列为空,让工作线程阻塞。如果任务队列有新任务,通知工作线程要干活。
线程管理类,它能够创建一定数量的线程,并且还要能控制任务队列(获取,添加)
源码里work继承了Runnable接口,所以线程池里的线程就是work。线程池是一个容器,任务队列是通过方法传参的形式传进这个容器里。
然后那个线程放入线程池是execute()方法,线程池关闭是shutdown()方法。
ExecutorService
我觉得里面executorService的理解是重点中的重点,它里面有把任务传进线程池的方法,其实我觉得SUN源码写的不够好,继承关系那么多层,它每一层里面写几句,代码就是一坨翔嘛。<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
把任务callable传进线程池,他们说有一个返回值,但是我没有看见。我不关心你线程池里面谁来干活,几个人来干,总之我只要个结果。
3.具体线程池的理解我慢慢补上,只是我看的多了,才明白原来volatile变量主要用在线程池里面,难怪以前没接触,总感觉看起来怪怪的
- 线程与线程池
- 线程池 线程优先级
- Executor线程,线程池
- 线程、多线程、线程池
- IOS-线程、线程池
- Java线程:线程池
- 线程和线程池
- 线程、多线程、线程池
- 线程、多线程、线程池
- 线程(六)线程池
- ExecutorService(线程池)+线程
- 线程和线程池
- 线程&线程池 简略
- 线程和线程池
- 线程池 线程锁
- 线程、线程池总结
- 线程与线程池
- 线程、锁、线程池
- spring中缓存配置(完善)
- excel 转txt文件
- java 消息机制 ActiveMQ
- CentOS 7 SSH配置免密码登录
- opencv2:Mat基础 转
- 线程池
- ORM详解(Hibernate)
- 实验2_运算符和表达式
- 三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法
- spring framework体系结构及内部各模块jar之间的maven依赖关系
- JavaSE 04 数组
- java算法视频深度讲解
- VC++6遇到的问题(持续更新)
- 续一,用RecyclerView来实现苹果后台样式的卡片布局