线程池的初步认识(一)
线程池的初步认识(一)
一、定义
- 管理一组工作线程。
二、作用
- 可以限制应用程序中同一时刻运行的线程数;
- 可以应用在多线程服务器上。
三、好处
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗,比如内存;
- 提高响应速度。创建线程再到执行任务的额外时间,会延迟处理的请求;
- 提高线程的客观理性。通过线程池,实现对线程的统一分配,调优和监控;比如可以避免无线创建线程引起的OutOfMemoryError。
四、java 5 在 java.util.concurrent 中内置线程池 Excutors,返回对象为ThreadPoolExecutor,包含三种创建的方法:
ExecutorService executorService1 = Executors.newSingleThreadExecutor(); ExecutorService executorService2 = Executors.newFixedThreadPool(10); ExecutorService executorService3 = Executors.newScheduledThreadPool(10);
五、执行
(一)、 通过execute
executorService.execute(new Runnable() { @Override public void run() { System.out.println("我要开始运行了"); } });
(二)、 通过submit
1.通过提交Runnable
Future future = executorService.submit(()->{ });
2.通过提交Callable
Future future = executorService.submit(() -> { return null; });
Runnable 和 Callable 的区别
- 非常相似,这两个接口都表示可以由线程或ExecutorService同时执行的任务。
- 不同之处是两个接口内部执行的方法不同。
-
Runnable
public interface Runnable { public void run(); }
-
Runnable
public interface Callable{ public Object call() throws Exception; }
- 可以看出,call()方法是有返回值的,而且可以引发异常。run没有返回值,也不能引发异常(除非未经检查的异常-RuntimeException的子类)。
3.如果执行的任务需要返回结果,使用Callable。
(三)、两种执行方法的区别
- execute 只能提交Runnable类型的任务;submit 除了可以提交Runnable类型的任务外,还可以提交Callable类型。
- execute 直接抛出任务执行的异常,submit 会捕获,可以通过返回值Future的get方法将执行任务时的异常重新抛出。
- submit 的顶级接口是ExecutorService;execute 的顶级接口是 Executor;
六、获取返回结果
(一)、 两种 invokeAny() 和 invokeAll()
(二)、 invokeAny
- 当任意一个任务得到结果后,会调用interrupt方法将其他的任务中断;
- 部分任务失败,会使用第一个成功的任务返回的结果;
- 任务全部失败了,抛出Execption,invokeAny 方法将抛出ExecutionException。
(三)、 invokeAll 返回所有任务的执行结果,该方法的执行效果也是阻塞执行的,要把所有的结果都取回时再继续向下执行。
七、关闭 ExectorService
shutdown()
- 停止接收新的任务并且等待已经提交的任务(包含提交正在执行和提交未执行)执行完成。在终止前允许执行以前提交的任务;
shutdownNow()
- 阻止等待任务的启动并试图停止当前正在执行的任务。不允许执行以前提交的任务。
awaitTermination()
- 接收timeout和TimeUnit两个参数,用于设定超时时间及单位。当等待超过设定时间时,会监测ExecutorService是否已经
关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。
在实际使用过程中, 使用shutdown()关闭,回收资源。如果有必要,可以在其后执行shutdownNow(),取消所有遗留的任务。
八、例子
ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<Callable<String>> callables = new HashSet<Callable<String>>(); callables.add(() -> { return "Task 1"; } }); callables.add(() -> { return "Task 2"; } }); List<Future<String>> futures = executorService.invokeAll(callables); for(Future<String> future : futures){ System.out.println("future.get = " + future.get()); } executorService.shutdown(); while (!service.awaitTermination(1, TimeUnit.SECONDS)) { System.out.println("线程池没有关闭"); }
github博客列表地址
欢迎关注公众号,查看更多内容 :
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
LeetCode 387: 字符串中的第一个唯一字符 First Unique Character in a String
题目: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1. 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. 注意事项:您可以假定该字符串只包含小写字母。 Note: You may assume the string contain only lowercase letters. 解题思路: 很简单的题,无非就是对字符串的字母进行频率统计,找到出现频率为1 的字母索引。 借助哈希映射两次遍历完成。第一次遍历进行字母频率统计,Hash Map 的Key 为字母,Value 为出现频率。第二次遍历找到频率为 1 的字母索引返回即可。 不同于单词频率统计,字母一共只有 26 个,所以可以直接利用 ASii 码表里小写字母数值从 97~122,直接用 int 型数组...
- 下一篇
原生javascript中的的AJAX写法
js中ajax get请求的写法 var xhr=new XMLHttpRequest(); xhr.open('get','请求地址') xhr.send(); xhr.onreadystatechange=function () { if (xhr.readyState==4) { // console.log(xhr.responeText } } js中post请求的写法 var xhr = new XMLHttpRequest(); xhr.open('post',"请求地址",true); // 如果是post请求 必须加上请求头 xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.send("userName="+user.value+'&passWord='+pass.value); xhr.onreadystatechange =function(){ if (xhr.readyState==4) { var obj = JSON.parse(xhr.res...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装Nodejs环境