c++ 异步下获取线程执行结果_这份阿里技术官强推的java线程池笔记,建议你看一下

线程池

  • 线程是宝贵的内存资源,单个线程占1MB空间,过多分配易造成内存溢出
  • 频繁的创建及销毁线程会增加虚拟机回收频率、资源开销、造成程序性能下降
  • 因此线程池出现了

线程池的概念

  • 线程容器,可设定线程分配的数量上限
  • 将预先创建的线程对象存入池中,并重用线程池中的线程对象
  • 避免频繁的创建和销毁

线程池的原理

8110313f9b795179fb9488479f88aa1d.png

获取线程池

787b5c0ea2b4ed9938b2980397979a59.png

创建线程池

public class TestThreadPool {    public static void main(String[] args) {        //  1.  创建固定线程个数的线程池对象        //线程池里可存在4个线程        ExecutorService es = Executors.newFixedThreadPool(4);        //  2.  创建任务        Runnable runnable = new Runnable() {            private int ticket = 100;            @Override            public void run() {                while (true) {                    if(ticket <= 0) {                        break;                    }                    System.out.println(Thread.currentThread().getName() + "买了" + ticket--);                }            }        };        //  3.  提交任务        for(int i = 0; i < 5; i++) {            es.submit(runnable);        }        //  4.  关闭线程池        es.shutdown();    }}

执行结果

95c9b624704b35bef60ea5c86295db61.png

//  1.  创建单线程的线程池        ExecutorService es = Executors.newSingleThreadExecutor();//  1.  创建缓冲线程池,线程的个数由任务来决定        ExecutorService es = Executors.newCachedThreadPool();

Callable接口

public interface Callable{    public V call() throws Exception;}
  • JDK5加入,与Runnable接口类似,实现之后代表一个线程任务
  • Callable具有泛型返回值、可以声明异常

Future接口

  • 概念:异步接受ExecutorService.submit()所返回的状态结果,当中包含了call()的返回值
  • 方法:V get()以阻塞形式等待Future中的异步处理结果(call()的返回值)

示例

  • 使用Future和Callable接口
  • 使用两个线程,并发计算1-50,51-100的和,再进行汇总
//示例public class TestCallable {    public static void main(String[] args) throws Exception {        //  1.创建线程池对象        ExecutorService es = Executors.newFixedThreadPool(2);        //  2.  提交任务并得到Future对象,任务有Callable匿名对象来承担        Future future1 = es.submit(new Callable() {            @Override            public Integer call() throws Exception {                    //完成1-50的加和运算并得到结果                System.out.println("start 1-50 count...");                int sum = 0;                for(int i = 1; i <= 50; i++) {                    sum += i;                }                return sum;            }        });        Future future2 = es.submit(new Callable() {               @Override            public Integer call() throws Exception {                    //完成51-100的加和运算并得到结果                System.out.println("start 51 - 100 count...");                int sum = 0;                for(int i = 51; i <= 100; i++) {                    sum += i;                }                return sum;            }        });        //  3.  使用Future对象的get()方法得到运算结果        System.out.println("1-100的加和结果为:" + (future1.get() + future2.get()));        //  4.  关闭资源        es.shutdown();    }}

结果

b47d0b906cfb075ab4c613d800d72067.png

Lock接口

  • JDK5加入,与synchronized比较,显示定义,结构更灵活
  • 提供更多实用性方法,功能更加强大,性能更优越

常用方法

//获取锁,如锁被占用,则等待void lock()   //尝试获取锁(成功true,失败false,不阻塞)boolean tryLock//释放锁void unlock()
//示例public class TestLock implements Runnable {    Lock l = new ReentrantLock();    private int ticket = 100;    @Override    public void run() {        while (true) {            l.lock();            try {                if(ticket <= 0) {                    break;                }                System.out.println(Thread.currentThread().getName() +  " sells " + ticket--);            } catch (Exception e) {                e.printStackTrace();            }finally {                l.unlock();            }        }    }    public static void main(String[] args) {        ExecutorService es = Executors.newFixedThreadPool(4);        for(int i = 0; i < 4; i++) {            es.submit(new TestLock());        }        es.shutdown();    }}

执行结果

38dd132e2ff4bf922679234e24b99959.png

线程安全的集合

63bd9c855164b7d2927378b7a748923b.png

Collections中的工具方法

1c0362349d9d22b185287ddce3d26619.png

Queue接口(队列)

d35c865766e51c9e8e7f1c7c4a95ba19.png
//示例public class TestQueue {    public static void main(String[] args) {        //  1.  创建PriorityQueue队列对象        PriorityQueue q = new PriorityQueue();        //  2.  队列添加元素,“入列”        q.offer("a");        q.offer("b");        q.offer("c");        q.offer("d");        q.offer("e");        //  3.  取值,“出列”        System.out.println(q.poll());        System.out.println(q.poll());        System.out.println(q.poll());        System.out.println(q.poll());        System.out.println(q.poll());    }}

执行结果

a53292690002569e32060d2556a50d08.png

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

此应用无法在你的电脑上运行_能直运行iOS应用!苹果新macOS翻车 正式版下载后无法安装...

原标题&#xff1a;能直运行iOS应用&#xff01;苹果新macOS翻车 正式版下载后无法安装 今天&#xff0c;苹果正式推出了macOS Big Sur正式版&#xff0c;其是苹果为Mac电脑设计的下一代操作系统&#xff0c;最大的变化是在性能上&#xff0c;因为Big Sur是第一个以苹果自研处理…

springcloud 整合 gateway_从Spring Cloud到Kubernetes的微服务迁移实践

写在前面要出发周边游&#xff08;以下简称要出发&#xff09;是国内知名的主打「周边游」的在线旅行网站&#xff0c;为了降低公司内部各个业务模块的耦合度&#xff0c;提高开发、交付及运维效率&#xff0c;我们在 2017 年就基于 Spring Cloud 完成了公司内部业务微服务化的…

leetcode 191. 位1的个数

经典题目&#xff0c;位操作的小技巧&#xff1a;与操作 我们可以把前面的算法进行优化。我们不再检查数字的每一个位&#xff0c;而是不断把数字最后一个 1 反转&#xff0c;并把答案加一。当数字变成 00 的时候偶&#xff0c;我们就知道它没有 1 的位了&#xff0c;此时返回…

程序员如何跟领导提离职_如何优雅地跟老板提加薪?按照这3个步骤来,也不是什么难事...

通常情况下&#xff0c;如果你在一个制度比较健全的单位上班&#xff0c;基本上不需要自己提出加薪的要求&#xff0c;达到规定的条件自然就涨工资了。但是我们绝大部分人&#xff0c;是在中小企业上班&#xff0c;如果不跟老板提加薪要求&#xff0c;老板很难主动给你涨工资。…

leetcode 打印从1到最大的n位数

书上原题本想考的是大数问题&#xff0c;但是leetcode上要求的返回值是int&#xff0c;不可能出现当n过大时大数越界的问题&#xff0c; 失去了本题的意义。按大数问题处理&#xff0c;用string和递归来处理该问题。 public class Solution {public int[] PrintNumbers(int n) …

强制关机对电脑的影响_电脑强制关机,对电脑有影响吗?你被伪科普骗了多久?...

相信大多数人都会遇到这么个情况&#xff0c;就是电脑用着用着死机、卡顿&#xff0c;在毫无反应又动弹不得的情况下&#xff0c;采用的招数就是长按电源键10秒强制关机重启。这时候身边的“电脑高手”就会告诉我们说&#xff0c;这样关机会毁害电脑硬件。但它却是处理电脑假死…

vb.net限制软件使用次数_新增投屏及倍数播放,这款软件iOSAndroid全都有,影视神器,抓紧体验...

小小影视 Android、iOS版小小影视以前也分享过&#xff0c;最近貌似版本更新了&#xff0c;新增投屏和倍数播放功能&#xff0c;还没用过的可以下载体验&#xff01;小小影视APP是一款最全&#xff0c;最新&#xff0c;关键不止有Android版&#xff0c;还有iOS版的影音播放软件…

leetcode 调整数组顺序使奇数位于偶数前面

解法一&#xff1a;双指针 public int[] Exchange(int[] nums) {int head 0;int tail nums.Length - 1;while(head < tail){if((nums[head] & 1) 1){head;continue;}else if((nums[tail] & 1) 0){tail--;continue;}else{int temp nums[head];nums[head] nums[…

pytorch test单张图片_PyTorch版EfficientDet比官方TF实现快25倍?这个GitHub项目数天狂揽千星...

EfficientDet 难复现&#xff0c;复现即趟坑。在此 Github 项目中&#xff0c;开发者 zylo117 开源了 PyTorch 版本的 EfficientDet&#xff0c;速度比原版高 20 余倍。如今&#xff0c;该项目已经登上 Github Trending 热榜。机器之心报道&#xff0c;项目作者&#xff1a;zyl…

Xcode and Unity missing library ‘lGoogleUtilities‘

https://stackoverflow.com/questions/58187800/xcode-and-unity-missing-library-lgoogleutilities

c++ 字符串合并_C语言输入字符和字符串(所有函数大汇总)

C语言输入字符和字符串(所有函数大汇总)C语言有多个函数可以从键盘获得用户输入&#xff0c;它们分别是&#xff1a;scanf()&#xff1a;和 printf() 类似&#xff0c;scanf() 可以输入多种类型的数据。getchar()、getche()、getch()&#xff1a;这三个函数都用于输入单个字符。…

appimage文件怎么安装_bauh:在一个界面中管理 Snap、Flatpak 和 AppImage | Linux 中国...

幸运的是&#xff0c;我偶然发现了一个支持这几种通用包格式的应用程序。-- John PaulSnap、Flatpak 和 AppImage 等通用软件包的最大问题之一就是管理它们。大多数内置的软件包管理器都不能全部支持这些新格式。幸运的是&#xff0c;我偶然发现了一个支持这几种通用包格式的应…

字符编码笔记:ASCII,Unicode 和 UTF-8

作者&#xff1a; 阮一峰 日期&#xff1a; 2007年10月28日 今天中午&#xff0c;我突然想搞清楚 Unicode 和 UTF-8 之间的关系&#xff0c;就开始查资料。 这个问题比我想象的复杂&#xff0c;午饭后一直看到晚上9点&#xff0c;才算初步搞清楚。 下面就是我的笔记&#x…

图形学教程Lecture 13: RayTracing1(Whitted-Style Ray Tracing)知识点总结

课程地址&#xff1a;https://www.bilibili.com/video/BV1X7411F744?p13 课件地址&#xff1a;https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html 感谢大神的课程 1.光线追踪的好处&#xff1a;真实&#xff0c;但是效率低&#xff0c;所以目前是离线渲染 2.whitt…

图形学教程Lecture 14: RayTracing1(Acceleration Radiometry)知识点总结

课程地址&#xff1a;https://www.bilibili.com/video/BV1X7411F744?p14 课件地址&#xff1a;https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html 感谢大神的课程 1.用统一的空间划分&#xff08;Grid&#xff09;加速计算光线相交。划分颗粒度需要注意&#xff0…

Unity项目代码书写规范

以Google的代码规范为主&#xff0c;稍加改动 https://google.github.io/styleguide/csharp-style.html 书写规范 基础写法 Pascal和驼峰混用&#xff0c;参数用驼峰写法&#xff0c;除参数外&#xff0c;都以Pascal写法为主。括号建议用换行方式书写Code 类, 方法, 枚举, …

python常用的包_Python3之常用包汇总

原博文 2020-06-04 10:53 − Python包网站: https://pypi.org/ 1. 繁体与简体转换(https://github.com/berniey/hanziconv.git) pip install hanziconv 示例: from hanziconv impo... 相关推荐 2019-12-09 20:32 − [TOC] # 1. 模块 ## 1.1 模块是什么&#xff1f; - 模块就是个…

vue如何获取年月日_BootstrapVue——Vue和Bootstrap的相结合,构建响应式应用更简单...

介绍BootStrap是世界上最受欢迎的构建响应式移动优先网站的框架&#xff0c;Vue是当前最流行的前端框架之一&#xff0c;BootstrapVue则是将两者相结合&#xff0c;使用BootstrapVue&#xff0c;可以使用Vue.js和前端CSS库--Bootstrap v4在Web上构建响应式&#xff0c;移动优先…

cpu队列长度太长解决方法_CPU中的调试算法对比

批处理系统中采用的调度算法重要指标(吞吐量&#xff0c;周转时间&#xff0c;CPU利用率&#xff0c;公平平衡)非抢占式的先来先服务算法(FCFS)&#xff1a;按照进程就绪的先后顺序使用CPU特点&#xff1a;公平&#xff0c;实现简单&#xff0c;但是长进程后面的短进程需要等待…

Mono,CLR,.net,Net Framework之间的关系

先粗略看下各自的意义&#xff1a; .Net&#xff1a;以下这些技术的统称。是一个平台&#xff0c;而.NET平台有一个实现标准&#xff0c;叫做.Net Standard&#xff1b;.Net Framework/.Net Core/Mono&#xff1a;实现了这个标准&#xff0c;其选择的组件不一定相同CLR&#x…