线程池学习简单笔记
来源:互联网 发布:金山wps office mac版 编辑:程序博客网 时间:2024/05/06 23:11
线程池三个优点
1 节省内存消耗 重复利用已经创建的线程( 线程的创建与销毁都要消耗系统资源) 2 提供响应速度 利用创建好的线程执行任务 无需等待线程重新创建 3 提高线程的可管理性
一个任务提交给线程池之后处理流程
任务提交上来------> 线程池先判断线程池大小是否达到corePoolSize----->如果线程池大小没达到corePoolSize则创建新的线程来执行该任务------>———如果workQueue已满则判断线程池大小是否达到maximumPoolSize--------》如果没有达到maximumPoolSize则创建新线程执行workQueue里的任务------》如果达到maximumPoolSize则执行拒绝策略RejectedExecutionHandler
线程池操作
开启线程池
1、execute()执行Ruannable类型的任务 2、submit():可用来提交Callable或Runnable任务,并返回代表此任务的Future对象
关闭线程池
1、shutdown()在完成已提交的任务后封闭办事,不再接管新任务 2、shutdownNow()停止所有正在履行的任务并封闭办事。 通常调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法
其他方法
isTerminated():测试是否所有任务都履行完毕了。 BlockingQueue<Runnable> getQueue()获取阻塞队列 getPoolSize() 获取线程池的大小 getCorePoolSize()获取核心线程数 getActiveCount()获取正在执行任务的个数
如何创建线程池
创建线程池有两种方式 一个是new ThreadPoolExecutor 一个是用Executors提供的api创建
ThreadPoolExecutor
构造方法 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) corePoolSize 线程池维护线程的最少数量 maximumPoolSize 线程池维护线程的最大数量 keepAliveTime 线程池维护线程所允许的空闲时间 workQueue 工作队列 threadFactory 线程创建工厂 handler 线程池对拒绝任务的处理策略
阻塞式队列
LinkedBlockingQueue 无界阻塞式队列(过多请求 后面加入的任务等待时间过长有时限的任务会失败) 系统的过载保护) PriorityBlockingQueue 带优先级的无界阻塞队列 阻塞式队列的插入操作 add():加一个线程到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常 offer():将线程加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false. put():将线程加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续,处于一直阻塞的状态阻塞式队列的移除操作 remove()方法直接删除队头的元素: pool()方法取出并删除队头的元素,当队列为空,返回null; take()方法取出并删除队头的元素,当队列为空,则会一直等待直到队列有新元素可以取出,或者线程被中断抛出异常
Executors
1:创建固定个数的线程数, ExecutorService executorService = Executors.newFixedThreadPool(5);2:创建单个线程数: ExecutorService executorService = Executors.newSingleThreadExecutor()3:创建带缓存的线程池 ExecutorService executorService = Executors.newCachedThreadPool();当然Executors还可以创建定时调度的线程池4:Executors.newScheduledThreadPool(5); 这个返回的是ScheduledExecutorService对象,它继承了ExecutorService接口,ScheduledExecutorService适用于需要多个后台线程 执行周期任务,同时为了满足资源管理的需求而需要限制后台线程的数量的应用场景.5、单任务延迟连接池 Executors.newSingleThreadScheduledExecutor();
Executors.newFixedThreadPool(5);
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
FixedThreadPool线程池使用的队列是LinkedBlockingQueue,而且keepAliveTime设置为0L,也就是线程执行完任务立即回收
Executors.newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()))
SingleThreadExecutor的corePoolSize和maximumpoolSize都设置为1了 都用LinkedBlockingQueue。其原理是一个线程轮询的去 判断workQueue是否等于1,不等于1就从队列中去取一个线程来执行,
Executors.newCachedThreadPool()
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
KeepAliveTime设置为60L 线程池中的空闲线程可以等待新任务的最长时间为60秒,maximumPoolSize被设置为Integer.MAX_VALUE,即maximumPoolSize是无界的
0 0
- 线程池学习简单笔记
- python 学习笔记简单线程池实现
- 线程学习的简单笔记
- C++学习笔记--线程简单应用
- 线程池学习笔记
- 线程池学习笔记
- 线程池学习笔记
- 线程池-学习笔记
- Java线程和线程池学习笔记
- 线程学习笔记(十二)-线程池
- Java线程池学习笔记
- 线程池学习笔记1
- 学习线程池笔记1
- C#线程池学习笔记
- C#学习笔记---进程与线程的一个简单解释
- <JAVA学习笔记4>——进程、线程简单介绍
- Java学习:线程池的简单构建
- 【学习记录】简单线程池的实现
- java八大类别以及容易出现的错误
- css3 animation 和animate.css
- CodeForces 598 D. Igor In the Museum(dfs)
- Log4j打印日志添加线程ID
- 图像局部显著性—点特征
- 线程池学习简单笔记
- the long song—最爱神秘博士里面的一首歌,超震撼!!!
- Map/Reduce二次排序与分组分区用法
- MySql学习(六)
- 玩转AppBarLayout,更酷炫的顶部栏
- HashMap与ArrayList的PK
- Android Lock Pattern 源码引用Demo
- hdu2105 Pipe
- 关于SVN导出项目出现的几个问题