多线程创建方式 线程池、Future和CompletableFuture

大家好,我是烤鸭:

     今天说一下 多线程的几种创建方式及使用。

1. Thread 和 Runnable


    继承 Thread 类 和实现 Runnable 接口。
    这种就不举例子了。

2.线程池


  现在主要有5种线程池。

  //缓存线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); //固定大小线程池ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);//单线程执行ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();//定时或延迟执行ExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);//窃取线程池ExecutorService workStealingPool = Executors.newWorkStealingPool();

其中 newWorkStealingPool 是jdk 1.8以后新出的,为了防止线程池启用过多,导致cpu占用过多导致的项目宕机。适用于执行多任务,且每个任务耗时时间较短。
  其余4种方式都有可能会出现占用cpu过高导致的项目宕机的情况。
  以 4核 16G的机器为例, Executors.newFixedThreadPool(10) 这种方式创建的线程池大小为10
  Executors.newWorkStealingPool() 创建线程池大小为4。一般来说,和核数相等
  即便不使用这种方式,也建议不要超过 核数 * 2。(具体看需求)


3. Future和CompletableFuture


Future 是 jdk1.5 以后出现的,用于异步多线程。
例子:

// 创建Future集合,用于存放完成的Future
List<Future<Long>> futureList = new ArrayList();
//多线程执行任务
for (int i = 0; i < 100; i++) {Future<Long> testFuture= workStealingPool.submit(new Callable<Long>() {@Overridepublic Long call() {//模拟执行耗时任务System.out.println("task 1 doing...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}return 0L;}});futureList.add(testFuture);
}
//遍历list,获取线程结果
for (Future<Long> taskResponseFuture: futureList) {if(taskResponseFuture.get().equals(0L)){//当前future执行完毕}
}

这里注意一下,Future.get()是阻塞方法。如果需要多线程执行操作,在最后的时候执行get()方法。
类似上边的例子,可以把 多个 Future 放到list中,再循环get。

CompletableFuture 是 Future的实现类,关于异步多线程提供了更多的api,下面介绍几种常用的。


supplyAsync 异步执行,有返回值

CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {//模拟执行耗时任务System.out.println("task 1 doing...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}//返回结果return 0;
});

thenAccept 接收上一阶段的输出作为本阶段的输入。多线程(单个线程)的顺序执行。

completableFuture1.thenApply(new Function<Integer, Object>() {@Overridepublic Object apply(Integer integer) {//模拟执行耗时任务System.out.println("task thenApply doing...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}return 0;}
});

whenComplete 异步监听结果

completableFuture1.whenComplete(new BiConsumer<Integer,Throwable>() {@Overridepublic void accept(Integer o, Throwable o2) {if(o == 0L){System.out.println("task complete...");}else{throw new RuntimeException();}}
});

 

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

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

相关文章

[css] 你有没有自己写过一套UI库?说下遇到哪些难点?

[css] 你有没有自己写过一套UI库&#xff1f;说下遇到哪些难点&#xff1f; 维护过&#xff0c;碰到的坑主要是 1&#xff09;同一个UI component在不同地方使用的customization问题。 2&#xff09;还有如果UI component如果有bug的话会导致所有使用的地方都出现bug 3&#x…

权限设计文章汇总

如何设计网站权限系统&#xff1f; https://www.zhihu.com/question/20313385/answer/118095995 我的转载&#xff1a;https://www.cnblogs.com/hao-1234-1234/p/9850967.html 应用程序权限设计 http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permiss…

dubbo 整合 zipkin,最简单的方式,亲测有效

大家好&#xff0c;我是烤鸭。 之前也试过网上很多版本&#xff0c;看了好多文章。现在分享最简单的方式&#xff0c;代码侵入性最小的。 1. 修改pom,引入jar。 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency><…

[css] 说说你对GPU的理解,举例说明哪些元素能触发GPU硬件加速?

[css] 说说你对GPU的理解&#xff0c;举例说明哪些元素能触发GPU硬件加速&#xff1f; GPU: 图形处理器,用于处理图形有关的任务,用于渲染页面在css中使用 transform: translateZ(0),可以开启GPU硬件加速个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

@Retention 注解的作用

注解Retention可以用来修饰注解&#xff0c;是注解的注解&#xff0c;称为元注解。Retention注解有一个属性value&#xff0c;是RetentionPolicy类型的&#xff0c;Enum RetentionPolicy是一个枚举类型&#xff0c;这个枚举决定了Retention注解应该如何去保持&#xff0c;也可理…

fastjson 1.2 版本之前的bug, 反序列化时自动排序,导致签名不过

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一个问题&#xff0c;使用fastjson 导致签名不过。 1. 问题复现&#xff1a; fastjson 1.2.4 获取返回值&#xff1a; {"data":[{"id":"120190422110857284042111114","bankAccountTyp…

[css] 你知道CSS中的字母“C“代表什么吗?

[css] 你知道CSS中的字母"C"代表什么吗&#xff1f; CSS(Cascading Style Sheets)。"C" 即为 Cascading 层叠的意思&#xff0c;我们编写 CSS 的时候&#xff0c;写在后面的样式会覆盖前面的样式即层叠。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流…

[Network Architecture]DPN(Dual Path Network)算法详解(转)

https://blog.csdn.net/u014380165/article/details/75676216 论文&#xff1a;Dual Path Networks 论文链接&#xff1a;https://arxiv.org/abs/1707.01629 代码&#xff1a;https://github.com/cypw/DPNs MXNet框架下可训练模型的DPN代码&#xff1a;https://github.com/m…

[css] 怎么自定义鼠标指针的图案?

[css] 怎么自定义鼠标指针的图案&#xff1f; cursor: url() ,auto url是自定义光标图案的绝对路径&#xff0c;auto是默认光标&#xff0c;当我们自定义的光标不起作用时&#xff0c;就用默认光标代替。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

javax.script.ScriptException: ReferenceError: xxx is not defined in eval

大家好&#xff0c;我是烤鸭&#xff1a; 今天使用 javax.script.ScriptEngine 遇到一个奇怪的问题&#xff0c;无法识别js方法。 1. 报错内容&#xff1a; javax.script.ScriptException: ReferenceError: "a" is not defined in <eval> at line number…

Python的特殊成员

Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格&#xff1a;避免用下划线作为变量名的开始。 现在我们来总结下所有的系统定义属性和方法&#xff0c; 先来看下保留属性&#…

[css] Reset CSS和Normalize CSS的区别是什么?

[css] Reset CSS和Normalize CSS的区别是什么&#xff1f; Reset&#xff1a;将所有浏览器的默认样式都统一化&#xff0c;注重的是跨浏览器统一样式&#xff0c;用户还要自行添加一些默认样式。 Normalize&#xff1a;会根据各个浏览器的不同保留有用的浏览器特色样式&#x…

java 实现 常见排序算法(四)基数排序

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下基础排序算法之基数排序。 1. 基数排序&#xff1a; 原理&#xff1a;基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#…

vyos User Guide

vyos User Guide 来源 https://wiki.vyos.net/wiki/User_Guide The VyOS User Guide is focused on providing a general overview of the installation, configuration, and operation of the VyOS network operating system. Introduction VyOS is a Linux-based network ope…

[css] 为什么要使用css sprites?

[css] 为什么要使用css sprites&#xff1f; 减少HTTP请求增加图片显示速度个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Java 面试题(3)—— JVM

JVM的内存结构。 JVM主要结构&#xff1a;堆内存、栈、方法区&#xff0c;程序计数器&#xff0c;永久代&#xff09;&#xff08;jdk 8采用元空间替代&#xff09;。 堆内存又分成年轻代和年老代。 年轻代由三部分组成&#xff0c;Eden、From Survivor 和 To Survivor&#xf…

[css] 标签、class和id选择器三者的区别是什么?分别在什么时候用?

[css] 标签、class和id选择器三者的区别是什么&#xff1f;分别在什么时候用&#xff1f; 标签选择器&#xff1a;tag{} 选取对应的标签例如 a span div class选择器&#xff1a;.class-name{} 选取对应class-name的元素 id选择器&#xff1a;#id-name{} 选取对应id的元素 其中…

web前端开发怎么样学习?看这份web前端学习路线

前端开发是创建Web页面或app等前端界面呈现给用户的过程。前端开发通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互。它从网页制作演变而来&#xff0c;名称上有很明显的时代特征。在互联网的演化进程中…

今天分享一下做支付宝小程序遇到的坑。ISV权限不足,建议在开发者中心检查对应功能是否已经添加。验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下做支付宝小程序遇到的坑。pom版本 <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-j…

[css] 举例说明时间、频率、角度、弧度、百分度的单位分别是哪些?

[css] 举例说明时间、频率、角度、弧度、百分度的单位分别是哪些&#xff1f; 时间: s, ms频率: Hz角度: deg弧度: rad百分度: grad个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起…