线程池-简单使用及原理,以及自定义线程池
来源:互联网 发布:saas软件服务协议 编辑:程序博客网 时间:2024/06/14 09:53
借鉴自马伟奇的视腾讯频
首先ThreadPool肯定是比new Thread好的
优点:
1.可以重用线程(重用机制原理在下方)
2.控制最大并发线程数。
3.更多的功能(定时定期执行,单线程,并发数控制)
(在优化性能的方面简直就不谈了)
线程池种类:
1.newCachedThreadPool可缓存线程池,就是重用以前构造的线程,如果没有可用的,就新建。如果一个线程60秒没被使用,就会被终止使之不占资源。
2.newFixedThreadPeel定长线程池,控制线程最大并发数,超出的线程在队列中等待。
3.newScheduledThreadPool定长线程池,支持定时,周期性任务执行。
4.newSingleThreadExcutor单线程化线程池,举一个别人举过的例子,厕所只有一个坑位,排队上(按照FIFO,LIFO,优先级等规则)
系统线程池使用
单线程池
长度为5的线程池
缓存线程池
都很好的印证了我们的猜测
自定义线程池
原理解释:核心线程有5个,工作队列可以容纳100个(这里是暂存的),所以105个以内都是这5兄弟在工作,最大线程10个,也就是说105个除外还可以再用5个,不过不在队列中了,需要新开线程了。所以106个应该是6兄弟在工作,一次类推。110是10兄弟在工作。111的时候就会报错。
110时
106时
111时
上代码
public class PoolTest { private static ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); private static ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); private static MyThreadPool myThreadPool = new MyThreadPool(5, 10); public static void main(String[] args) throws Exception { pool(myThreadPool.executor); } private static void pool(ExecutorService executorService) { for (int i = 0; i < 111; i++) { executorService.execute(new Runnable() { @Override public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } }); } } static class MyThreadPool { private ThreadPoolExecutor executor;// 这里简单介绍下sdk下ThreadPoolExecutor6个属性// public ThreadPoolExecutor(int corePoolSize, //核心数量// int maximumPoolSize, //最大数量// long keepAliveTime, //超过核心和队列大小的后创建的线程存活时间// TimeUnit unit,//单位// BlockingQueue<Runnable> workQueue,//队列// ThreadFactory threadFactory) {//工厂//// } MyThreadPool(int coreSize, int maxSize) { LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100); ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(0); @Override public Thread newThread(Runnable runnable) { return new Thread(runnable, "Thread-" + mCount.incrementAndGet()); } }; executor = new ThreadPoolExecutor(coreSize, maxSize, 60L, TimeUnit.SECONDS, workQueue, sThreadFactory); } }}
阅读全文
0 0
- 线程池-简单使用及原理,以及自定义线程池
- 线程池原理及使用
- java 线程池的原理以及使用
- JAVA_线程池简单使用与原理
- Android线程,线程池使用及原理博文参考
- Android线程,线程池使用及原理博文参考
- Android线程,线程池使用及原理博文参考
- Android线程,线程池使用及原理博文参考
- Android线程,线程池使用及原理博文参考
- java线程池ThreadPoolExecutor原理及使用
- 线程池(简单介绍及使用示例)
- 简单线程池实现原理
- 简单使用线程池
- 简单使用线程池
- 官方及自定义线程池
- 线程池原理及创建
- 线程池原理及创建
- 线程池原理及实现
- 学习笔记TF067:TensorFlow Serving、Flod、计算加速,机器学习评测体系,公开数据集
- LDA通俗解释
- 基本排序算法-java实现
- 2017 年你应该学习的编程语言、框架和工具
- 单例模式的三种实现
- 线程池-简单使用及原理,以及自定义线程池
- CSS中的三种样式来源:创作人员、读者和用户代理(转载)
- TinyLinux学习1-VMware安装到磁盘
- bigdata-11
- 出现Internal Server Error错误
- VISIO中如何增加连接点
- 菜鸟学习历程【6】关键字、指针
- bigdata-12
- bigdata-13