线程池

来源:互联网 发布: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变量主要用在线程池里面,难怪以前没接触,总感觉看起来怪怪的


0 0
原创粉丝点击