学习Java基础知识,打通面试关~十三锁机制
静态创建线程池
我们平常使用的大部分还是依靠java中自带的静态工厂产生的线程池。先了解下自带的线程池。
newFixedThreadPool(int numThreads)
该线程池会在初始化的指定线程数量。具有以下的特点
1.在任何时刻都是最多有numThreads的线程数量活动。如果超过限制会在LinkedBlockingQueue中等待。
2.当达到核心线程数的时候,线程数不在继续增加。
3.有工作线程退出,新的工作线程被创建来达到设置的线程数。
Executors.newFixedThreadPool(1); //源码实现 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
newCachedThreadPool
该线程池是一个可以用来缓存的线程池。
1.尝试缓存使用过的线程。
2.没有缓存的线程池时,就会使用工厂方法创建线程池,最大的容量理论上是Integer.MAX_VALUE。这个跟服务器的配置有关。所以如果过来大量的线程任务,那么该线程池会在瞬间创建多个线程来执行工作。
3.时间上多余的线程超过60秒会被终止移除缓存中。
4.内部使用的SynchronousQueue实现的队列,该队列在实现的时候没有容量。适合来做交换的工作。
Executors.newCachedThreadPool(); //源码实现 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
newSingleThreadExecutor
该线程池是用来设置单个的线程池,使用的队列是无界队列。
因为提交的任务只要一个是能活动的,剩下的是放到无界队列中。
队列是先进先出的。那么执行顺序是有序的。
Executors.newSingleThreadExecutor(); //源码 public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
newWorkStealingPool
工作线程,该线程是在jdk1.8以后新增加的.使用的是ForkJoinPool创建线程池。该任务执行没有顺序。需要考虑到硬件的cpu核心数。
Executors.newWorkStealingPool(); public static ExecutorService newWorkStealingPool() { return new ForkJoinPool (Runtime.getRuntime().availableProcessors(), //默认使用的是硬件的cpu数目 ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); } Executors.newWorkStealingPool(10); public static ExecutorService newWorkStealingPool(int parallelism) { return new ForkJoinPool (parallelism, // 使用的是自定义的核心数 ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); } newSingleThreadScheduledExecutor()与newScheduledThreadPool(int poolSize)
周期性的调度执行任务的线程池。 单个执行。
Executors.newSingleThreadScheduledExecutor(); public static ScheduledExecutorService newSingleThreadScheduledExecutor() { return new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1)); } //核心周期执行的线程数 Executors.newScheduledThreadPool(10); public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); }
了解其java内部的静态线程池,并且在程序中使用其策略。当然在这种我们没有看到的是线程池的拒绝策略。无界队列和有界队列,核心数的与最大的核心数的设置,这些不同。那么我们的执行拒绝策略也是不同的。在接下里的文章我们会具体了解拒绝策略。
原文发布时间为:2018-07-09
本文作者:mengrui
本文来自云栖社区合作伙伴“LuckQI”,了解相关信息可以关注“LuckQI”。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微博python爬虫,每日百万级数据
新浪微博绝对是一个巨大的,实时的语料库!对微博数据爬取和分析,有重大的意义。 比如,现在要调查工商银行的服务态度,就可以抓取微博内容中包含工商银行的微博语料,然后做情感分析,就可以得到用户对银行服务的满意程度。 再比如,最近火热的明星鹿晗,可以抓取鹿晗的粉丝信息,分析这些粉丝处于什么年龄段,有什么标签,爱好,性别分布等等。这种对人群的分析,还可以同理应用到商业品牌上,用用户市场调研。 当然例子还有很多,那么,首先,要有微博数据! 所以,就产生了众多的微博爬虫项目。后来,新浪微博也开放了微博的API接口,但是官方的东西,限制还是很多的。 准备工作 User-Agent池 爬微博,这种大项目,必要充分的伪装是必须的,所以需要一个User-Agent池,每次,随机选择一个User-Agent。 我整理的在这里:User-Agent池 充足的微博账号 微博爬虫,必须登录以后,才能抓取。而一直使用一个账号,是很容易被封号的! 所以,需要多准备几个账号,每次随机选择一个账号登录,进行抓取。(实际是随机选择一个cookie)。 至于买微博账号的地方,某宝就有: 充足的IP代理 如果你想很快的进行抓取...
- 下一篇
在 web 上使用 JavaScript 模块
现在所有主流现代浏览器都已经支持JavaScript 模块。本文将介绍如何使用 JS 模块,如何有效地部署,以及 Chrome 团队如何使 JS 模块在未来变得更好用。 什么是 JS 模块? JS 模块(也称为“ES 模块”或“ECMAScript模块”)是 ES6 中一项非常重要的语言特性。在此以前,你可能使用过用户级别的 JavaScript 模块系统,比如在 Node.js 中的 CommonJS,或者是AMD,或者其他别的实现。所有的模块系统都包含一个共同点:允许导入和导出内容。 现在,JavaScript 拥有标准化的语法来完成这些事。在一个模块中,可以使用export关键字来导出任何内容,比如一个const,一个function或任何其他变量绑定或是声明。只需在变量语句或声明前面加上export即可: // lib.mjs export const repeat = (string) => `${string} ${string}`; export function shout(string) { return `${string.toUpperCase()}!`; ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果