首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 异步编程最佳实践

该做和不该做的 为了方便测试, 你应该在代码中将功能从多线程中隔离出来。当在Java编写异步代码时,你应该遵循异步模型,这样调用线程就不会被阻塞。...注意构造函数不能是异步的,你不应该在构造函数调用异步方法。当任务互相不依赖时异步方式尤其有用。当调用任务依赖被调用任务时不应该使用异步(译者按:这对异步来说无意义,因为业务上调用线程被阻塞了)....你应该在异步方法处理异常. 你不应该为长时间的task实现异常....Java 8parallelStream内部利用Fork/Join执行并发操作。...如果使用Java 8,可以使用CompletableFuture类(可以参考写的另外一篇文章Java CompletableFuture 详解),它提供了更多的异步的控制,如果你还在使用较老版本的Java

89620

2022 最新整理的 Java 多线程面试题(最新版 Java 面试宝典)

20 启动一个线程是用 start 还是 run 方法?21 一个线程多次调用 start 会发生什么?22 start 和 run 方法有什么区别?...71 谈谈多线程的 ExecutorService 接口?72 谈谈多线程的 ThreadPoolExecutor 类?73 什么是线程池?74 使用线程池有什么好处?...77 线程池 ExecutorService 和 Executors 的区别?78 Java 里面有哪些内置的线程池?79 为什么阿里不让用 Executors 创建线程池?...121 parallelStream 的底层实现是什么?122 parallelStream 有没有遇到什么坑?123 parallelStream 是线程安全的吗?...124 parallelStream 默认启动了多少线程?125 parallelStream 如何修改默认线程数?126 parallelStream 和 stream 的区别?

73110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试官让说出8种创建线程的方式,只说了4种,然后挂了。。。

    写在开头 昨天有个小伙伴私信说自己面试挂在了“Java有几种创建线程的方式”上,问他怎么回答的,他说自己有背过八股文,回答了:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池这四种...Callable"; } } //打印结果:是线程Callable 这个示例里使用了FutureTask,这个类可用于异步获取执行结果或取消执行任务的场景。...④ 使用ExecutorService线程池 通过Executors创建线程池,Executors 类是从 JDK 1.5 开始就新增的线程池创建的静态工厂类,它就是创建线程池的,但是很多的大厂已经不建议使用该类去创建线程池...因此,在这里我们只将它作为一个案例参考,真实开发不建议使用!...【代码示例5】 public class Test { public static void main(String[] args) { // 使用工具类 Executors

    13400

    为什么用 Java:一个 Python 程序员告诉你

    如果用流,上述就可以简化为首先将集合转换成流,然后使用函数: ? Java同时支持用parallelStream()来进行流的并行处理。...使用Maven会显著降低管理Java项目的认知开销。 Maven Central是Java世界的PyPI,为已发布的Java库提供一站式服务。...自此,我们建议使用java.time的日期/时间函数代替Joda-Time。但是,如果你需要使用 Java 8之前的版本,Joda-Time提供了无与伦比的API。...Play基于Akka的非阻塞I/O,提供了编写Web应用程序的可扩展的异步框架。如果想使用不那么前沿但是被广泛应用于产品的框架,请尝试Jetty。 单元测试 JUnit 仍为编写单元测试的标准。...目前为止,一直在为Java说好话,但是有些方面它还是很烂。 它还是Java! Java的历史遗留不可避免,Java仍然向下兼容其最早的版本,这意味着语言和标准库的最烂的部分还存在着。

    79410

    为什么用 Java:一个 Python 程序员告诉你

    在大多数情况下,你可以简单得用parallelStream()替换stream()实现并行。...使用Maven会显著降低管理Java项目的认知开销。 Maven Central是Java世界的PyPI,为已发布的Java库提供一站式服务。...自此,我们建议使用java.time的日期/时间函数代替Joda-Time。但是,如果你需要使用 Java 8之前的版本,Joda-Time提供了无与伦比的API。...Play基于Akka的非阻塞I/O,提供了编写Web应用程序的可扩展的异步框架。如果想使用不那么前沿但是被广泛应用于产品的框架,请尝试Jetty。 单元测试 JUnit 仍为编写单元测试的标准。...目前为止,一直在为Java说好话,但是有些方面它还是很烂。 它还是Java! Java的历史遗留不可避免,Java仍然向下兼容其最早的版本,这意味着语言和标准库的最烂的部分还存在着。

    1.1K90

    一文讲透虚拟线程!

    其实如果有用过 akka 的朋友们会发现,其实两者很相似,只不过使用 akka 是应用程序来处理,而虚拟线程是 JVM 来处理,使用上更简洁且方便。...要在 SpringBoot 中使用虚拟线程很简单,增加如下配置即可: /** * 配置是用于稍后测试,spring.virtual-thread=true是使用虚拟线程,false时还是使用默认的普通线程...150ms 了,这是因为系统线程是一个很昂贵的资源,SpringBoot tomcat 默认的最大连接数应该是 200,在连接池的线程被耗尽后,这 200 个线程在那干等 50ms 结束,而剩下的请求也只能等待...不过我们目前大部分的应用都是 IO 密集型应用较多,比如典型的 WEB 应用,大量的时间在等待网络 IO(DB、缓存、HTTP 等等),使用虚拟线程的效果还是非常明显的。...最后:大部分的公司可能还在用 Java8,但是想说的是,是时候升级了,跟上时代的脚步吧,朋友们!

    14810

    Akka 宣布更改许可,创始人:Apache 2.0 许可模式风险越来越大

    BSL 并不是开源协议,用户虽然可以拿到源代码,但是使用时会受限。在非生产环境,BSL 协议的软件可以不受限制的使用,如果用于商业目的,那么会有所限制。...Akka 的生产使用需要 Lightbend 的商业许可。商业许可证将免费提供给处于早期阶段的公司(年收入低于 2500 万美元)。...在公告,Lightbend 创始人兼 CEO Jonas Bonér 解释了为什么要对许可证进行变更。...Bonér 表示,“最初为 Akka 选择 Apache 2.0 许可证时,并没有意识到如果 Akka 成为一个大型的全球项目后会产生什么样的影响。...这意味着利用该软件谋利的公司需要做一些回馈,无论是代码、文档、社区工作还是金钱。“在可持续的开源参与者应该感到做贡献的必要性和道德义务。”

    58430

    ElasticMQ 0.7.0:使用Akka和Spray的长轮询,非阻塞实现

    这是一次重要的重写,核心部分是使用Akka Actor和REST层则采用Spray。目前为止,只有核心部分和SQS模块被重写;SQL后端和复制(Replication)尚在进行。...我们可以使用简单的可变数据结构,而不需要任何线程同步,因为参与者模型(Actor Model)为我们处理了这个问题。...Spray有一个很好的教程,如果您有兴趣,鼓励您看看。 如何使用路由中的队列Actor来完成HTTP请求?...这取决于路由是完全放弃请求还是使用一个值完成。该请求也可以在另一个线程完成; 或者,例如,在某个未来完成。这恰好是ElasticMQ所采用的。...使用Akka调度程序,我们还计划在指定的超时之后发回空列表并删除条目。 当新消息到达时,我们只需从map上获取一个等待请求,然后尝试完成它。同样,所有同步和并发问题都由Akka参与者模型来处理。

    1.6K90

    Akka 指南 之「术语及概念」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star、Fork,纠错。...术语及概念 在本章,我们试图建立一个通用的术语来定义一个坚实的基础,用于交流 Akka 所针对的并发和分布式系统。请注意,对于这些术语的许多,并没有一个统一的定义。...我们试图给出将在 Akka 文档范围内使用的定义。 并发 vs. 并行 并发和并行是相关的概念,但有一些小的区别。并发意味着两个或多个任务正在取得进展,即使它们可能不会同时执行。...同步 API 可以使用阻塞来实现同步,但这不是必要的。CPU 密集型任务可能会产生类似于阻塞的行为。一般来说,最好使用异步 API,因为它们保证系统能够进行。...活锁(Livelock)类似于死锁,因为没有参与者取得进展。不同之处在于,参与者不会被冻结在等待他人进展的状态,而是不断地改变自己的状态。一个示例场景是,两个参与者有两个相同资源可用时。

    80160

    CompletableFuture、parallelStream学习测试对比

    java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.Executors...获取异步任务结果:"); for (CompletableFuture f : futures) { //Object obj = f.getNow(1);//getNow()表示需要立即拿到结果...,如果当前的线程并未执行完成,则使用传入的值进行任务调用,参数为无法获取结果时使用传入的值 Object obj = f.get();//get()获取子线程运算的结果,会抛出检查到的异常...end-start)/1000); } /** * 手动配置线程执行器的线程池大小 */ private final static Executor myExecutor = Executors.newFixedThreadPool...) { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); //使用守护线程保证不会阻止程序的关停

    1.2K50

    spark RPC原理

    概述 Spark-1.6以后RPC默认使用Netty替代Akka,在Netty上加了一层封装,为实现对Spark的定制开发,所以了解SparkRPC的原理还是有必要的 Akka是一个异步的消息框架,所谓的异步...Netty也是一个知名的高性能,异步消息框架,Spark早期便使用它解决大文件传输问题,用来克服Akka的短板。...根据社区的说法,因为很多Spark用户饱受Akka复杂依赖关系的困扰,所以后来干脆就直接用Netty代替了Akka。 2. Spark 1.6+ 的RPC ?...继续看RpcEndpoint特质的定义: private[spark] trait RpcEndpoint { //当前RpcEndpoint注册到的RpcEnv主子,可以类比为Akka的actorSystem...val rpcEnv: RpcEnv //直接用来发送消息的RpcEndpointRef,可以类比为Akka的actorRef final def self: RpcEndpointRef

    98820

    Flink1.9.0源码调试介绍&增加调试超时时间

    一、Flink源码调试概述 在Flink1.9.0源码研究过程,调试源码是一个非常重要的手段,通过查看真实的运行数据和变量,来了解源码内部运行逻辑 如果是本地Jvm调试Flink,我们可以运行源码各种...JobMaster、TaskManager调试参数 1、配置调试参数 如果yarn上只有一个全局的Flink应用(即Cluster模式),我们可以在$FLINK_HOME/conf/flink-conf.yaml增加如下参数...$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java...(),这个HeartbeatManagerImpl成员变量heartbeatTimeoutIntervalMs很容易猜到就是心跳的超时时间 HeartbeatManagerImpl构造函数只有一个地方使用...因此,我们可以使用如下参数来增加调试超时时间(@@可以换成’;'号): -yD env.java.opts.jobmanager=-agentlib:jdwp=transport=dt_socket,server

    2.9K10

    Windows环境下Flink消费Kafka实现热词统计

    本文实现的重点主要有两个部分,一是kafka环境的搭建,二是如何使用官方提供的flink-connector-kafka_2.12来消费kafka消息,其他的逻辑部分和上文类似。..._2.12 1.7.1 然后新建一个KafkaToFlink类 ,代码逻辑和昨天的一样,都是从一段字符串中统计每个词语出现的次数,这个场景比较像我们的热搜关键字,标题简化为热词统计了。...(Promise.scala:36) at org.apache.flink.runtime.concurrent.Executors$DirectExecutionContext.execute(Executors.java...这样,TaskManager可以使用多个CPU内核,但同时,可用内存在不同的操作员或功能实例之间划分。...后面生产环境也打算使用kafka来传递从mysql binlog中心解析到的消息,算是一个生产实例的敲门砖吧。

    24840

    RxJava2.x 的并行编程

    在 Java 8 中有个并行流(parallelStream),有的同学可能用过,我们想使用并行流的方式打印出 1-100 之间的整数,来看下面的代码: private void parallelismWithJava8...threadNum = Runtime.getRuntime().availableProcessors() + 1; ExecutorService executorService = Executors.newFixedThreadPool...flatMap 实现的 subscribeOn,我们可以用它来定义异步,它还有一个重载的方法,我们可以指定 prefetch 的数量。...sequential 操作符是将并行的操作结果返回到并行流,这样,才能打印出所有的输出结果。 我们上面学会了好几种并行编程的方式,那么我们在实际的开发应该选择哪种呢?...最后,这边有个技术交流群,平常我会分享一些学习资源到群里,还可以和大家一起交流学习,需要的朋友可以扫描下面的二维码加我微信并备注「加群」,拉你进入技术交流群!

    99820

    Akka 指南 之「集群的使用方法」

    Auto-downing (DO NOT USE) 有一个自动downing的功能,但你不应该在生产中使用。...由于这些问题,auto-downing不应该在生产环境中使用。 Leaving 从集群删除成员有两种方法。 你可以停止 Actor 系统(或 JVM 进程)。...可以使用Akka GitHub」中提供的脚本akka-cluster管理集群。将脚本和jmxsh-R5.jar放在同一个目录。 不带参数运行它,可以查看有关如何使用脚本的说明: Usage: ....如果在使用默认调度器时出现与集群相关的问题,这通常表示你正在默认调度器上运行阻塞或 CPU 密集型参与者/任务(actors/tasks)。...为这些参与者/任务使用专用的调度器,而不是在默认调度器上运行它们,因为这样可能会使系统内部任务匮乏。

    4.7K60

    使用Akka HTTP构建微服务:CDC方法

    我们可以使用像Swagger(用于文档),Docker(用于测试环境),Selenium(用于端到端测试)等工具,但是我们最终还是会因为更改API而浪费大量时间,因为他们不是说谁适合来使用它们,或者设置合适的环境来执行集成测试...生产者特定的依赖关系仅用于数据库支持,如您所见,使用H2(在内存数据库),但您可以轻松地将其替换为其他数据库支持。...并且使用了隐式声明依赖关系,但可以显性地提高代码的可读性。...过去使用过Google Guice,看起来相当不错。...已经在CategoryEntity的相同的文件创建了它,但是如果您想要使用不同的包,则可以将它移动到不同的文件: CategoryEntity.scala package com.fm.mylibrary.producer.entity

    7.5K50

    CompeletableFuture的使用

    我们写了一个应用,这个应用需要通过互联网接口从其他的服务商那里取得价格,由于会有好多个服务商,因此我们先将操作封装到Shop类。...ParallelStream更高效一些,写了这么多,效率却不如默认的好,那如何提高我们自己的程序的运行效率呢?...提供自己的线程池 其实CompletableFuture跟parallelStream一样,都是使用的ForkJoinPool的默认线程池,线程数量默认为机器的内核数Runtime.getRuntime...().availableProcessors()得到 UCPU是期望的CPU利用率(该值应该介于0和1之间) W/C是等待时间与计算时间的比率 大家可以计算一下自己的,这里Ncpu=2...,Ucpu=100%,W/C = 1/0.01 = 100 ,因此取线程数=200来构造线程池 如下: static Executor executor = Executors.newFixedThreadPool

    94131
    领券