介绍

我开始分配读取包含100列和10万行的CSV文件并将其写入数据库。

方法1:简单的Java程序

所以我从一个简单的Java程序开始,运行一个while循环直到EOF,然后进行JDBC调用来存储值。这是需要花一个小时才完成了,但后来我意识到程序的运行时比创建程序花费的时间更长。因此,任务并不像看起来那么容易。那可以做些什么呢?当然,我意识到我需要并行完成任务。

方法2:线程Java程序

线程对我来说似乎总是很复杂。“Mutex”,“Semaphores”和“Monitors”的概念让我望而却步。所以我试着理解这个概念。Java使用Monitors来实现同步。Java的Monitors支持两种线程同步:互斥和合作。

通过虚拟机对象锁在Java中支持的互斥操作,使多个线程能够独立地处理共享数据而不会相互干扰。合作,是通过等待和通知来实现的。此方法使线程能够朝着共同的目标一起工作。

Monitor 区域

当线程到达监视区域的开头时,它将被放入相关监视器的条目集中。这个集就像银行柜台的队列一样。当一个人到达线路前端时,他们就可以进行交易。

关于线程的每一个讲座或文章总是提到消费者和生产者问题。所以我的问题与此类似,对吧?我有一个读取器(生产者),它读取一行并将其提供给JDBC层(消费者)以将其写入数据库。

Java已经提供了阻塞队列,使实现问题更容易。但我不能产生10万个线程来做到这一点。我需要类似线程池的东西来限制线程数。只需一个简单的循环和线程数就可以了。该解决方案看起来很好,在架构上很:page_with_curl:, 然后我意识到我忘记了错误处理。现在我意识到在线程中处理异常非常困难,因为它们不会返回任何内容。他们还有其他任何办法吗?所以,是的,Java 1.5中有“可调用接口”功能,它作为一个线程运行但返回未来。但这是另一个故事。

方法3:使用Actor的Java程序

执行上述任务使我意识到,随着复杂性的增加,维护此代码将非常困难。此外,Java为每个生成的线程使用系统线程。所以产生线程是有限的。

我需要的是一个为我提供并发处理的框架,我只能专注于它的业务逻辑部分。我找到了这样一个框架:Akka。Akka基于Erlang actor模型。如果您阅读上述问题的实现方式,则使用拉策略实现,消费者线程将在完成当前任务后执行新任务。所以我们需要等到生产者准备好了。如果系统更具反应性,那不是很容易吗?对于每个事件,事件处理程序都应该准备好完成工作。

因此,与银行类似地进行思考,以前我们曾经常常站在队列中,银行很难维持这个队列。有时客户厌倦了排队并离开。因此,银行可以做的是将此问题提交给第三方供应商并寻求解决方案。供应商建议使用令牌系统。让所有顾客坐在椅子上,直到他们的代号出现。对于银行而言,这听起来是一个很好的解决方案,并且为了增加锦上添花,供应商甚至准备好免费维护这个系统。想想银行会感受到的快乐。在Akka之后,我感受到了类似的快乐。Akka基于actors,所以actors是什么?

Actors

actors给你带来:

简单和高级的并发和并行抽象。

异步,非阻塞和高性能的事件驱动编程模型。

非常轻量级的事件驱动进程(每GB堆内存数百万个actor)。

使用Akka非常容易。它可以作为依赖项添加到我们的project.Simple jar文件中。所以,让我们亲自动手,编写一个Hello World程序。示例来自Akka文档。

让我们定义一个actor,Greeter:

Greeter extends UntypedActor {

String greeting = "";

public void onReceive(Object message) {

if (message instanceof WhoToGreet)

greeting = "hello" + ((WhoToGreet) message).who;

else if (message instanceof Greet) // //Send the current greeting back to the sender

getSender().tell(new Greeting(greeting), getSelf());

else unhandled(message)

}

}

对,就是那样。它只需要实现onRecieve方法,以便它对tell调用作出反应。

因此,要开始使用此actor,您需要创建一个actor系统:

final ActorSystem system = ActorSystem.create("helloakka");

// Create the greeter actor

final ActorRef greeter = system.actorOf(Props.create(Greeter.class), "greeter");

// Tell the greeter to change its greeting message

greeter.tell(new WhoToGreet("akka"));

因此,通过使用tell方法,您可以调用该方法。所以Akka保证一次只调用一次OnReceive方法。就这么简单,你不需要考虑同步。

Akka是一个非常可扩展的软件,不仅在性能方面,而且在其有用的应用程序大小方面。Akka的核心,akka-actor,非常小,很容易被放入现有的项目中,你需要异步和无锁并发而不会有麻烦。“向外扩展(Remoting)”确实看起来很有意义,对吧?

Akka中的所有内容都设计为在分布式环境中工作:actor的所有交互都使用纯消息传递,一切都是异步的。Actors允许您管理服务故障(Supervisors),负载管理(退避策略,超时和处理隔离),以及水平和垂直可扩展性(添加更多内核或机器)。

Actors往往更适合并行处理单元,这些处理单元对CPU要求不高,也可能更适合分布式并行计算(更高的延迟但更高的吞吐量)。

所以我使用actor的感觉非常好,比传统线程更快。

akka+java实现_使用Akka实现并发相关推荐

  1. java akka 教程_快速入门 Akka Java 指南

    快速入门 Akka Java 指南 Akka 是一个用于在 JVM 上构建高并发.分布式和容错的事件驱动应用程序的运行时工具包.Akka 既可以用于 Java,也可以用于 Scala.本指南通过描述 ...

  2. java akka 实战_《Akka实战:快速构建高可用分布式应用》(杜云飞)【摘要 书评 试读】- 京东图书...

    Akka 是一款优秀的分布式并发框架,虽然它是基于 Scala 语言实现的,但我们却可轻松地将其运行在JVM上,在不改变现有架构的基础上支持更高的并发量.另一方面,Akka 是一款轻量级开源技术,它既 ...

  3. java 协程 实现 Akka

    2019独角兽企业重金招聘Python工程师标准>>> java 协程 实现 Akka 博客分类: java Akka是开源的,可以通过Apache 2许可获得.可以从 http:/ ...

  4. java akka_用于大型事件处理的Akka Java

    java akka 我们正在设计一个大型的分布式事件驱动系统,用于跨事务数据库的实时数据复制. 来自源系统的数据(消息)在到达目的地之前经历了一系列转换和路由逻辑. 这些转换是多进程和多线程的操作,包 ...

  5. 用于大型事件处理的Akka Java

    我们正在设计一个大型的分布式事件驱动系统,用于跨事务数据库的实时数据复制. 来自源系统的数据(消息)在到达目的地之前经历了一系列转换和路由逻辑. 这些转换是多进程和多线程的操作,包括可以同时执行的较小 ...

  6. java多线程实例_多线程&高并发(全网最新:面试题+导图+笔记)面试手稳心不慌...

    前言 当你开始开始去跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是凉凉:现如今市场,多线程.高并发编程.分布式.负载均衡.集群等可以说是现在 ...

  7. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  8. akka学习教程(十四) akka分布式实战

    akka系列文章目录 akka学习教程(十四) akka分布式实战 akka学习教程(十三) akka分布式 akka学习教程(十二) Spring与Akka的集成 akka学习教程(十一) akka ...

  9. 复习Java异常处理_异常分类_自定义异常_线程初步了解

    复习Java异常处理_异常分类_自定义异常_线程 主要内容 异常.线程 教学目标 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点 ...

最新文章

  1. java数组与字符串编程及答案_04747_Java语言程序设计(一)_第4章_数组和字符串...
  2. JAVA取质数(素数)算法优化
  3. 全美第二的机器人项目核心数学课免费开放,院长亲自授课,作业讲义全同步...
  4. Tungsten Fabric SDN — 与 Bare Metal 的集成架构
  5. 2007年处女星座全年运势预测
  6. Java集合—Deque Stack
  7. Linux 定位网络不通问题
  8. ubuntu常见问题总结
  9. 深入浅出Java回调机制
  10. python date,datetime 和time的区别
  11. idea js检查太卡_IntelliJ IDEA抑制、禁用与启用检查
  12. poj 1609 Tiling Up Blocks 动态规划
  13. 第015讲 仿sohu首页面布局
  14. mysql中间件研究(tddl atlas cobar sharding-jdbc)
  15. linux卸载kodi,如何在Ubuntu 18.04上安装Kodi
  16. 富文本编辑器NicEdit的使用
  17. Triple Flips CodeForces - 1072E
  18. 开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?
  19. 快手科技音视频技术亮相ChinaMM 首次公开多媒体传输协议KTP
  20. BtTracker原理

热门文章

  1. wps教鞭功能_(完整)《初识wps演示》教学设计及反思
  2. CKS-最小化服务漏洞-pod security policy(PSP)
  3. STM32的电源复位和引脚复位
  4. Java毕业设计_基于智能判分的英语在线考试系统
  5. Oracle Discoverer 产品
  6. 记录spring cloud项目线上JVM配置
  7. 设计模式的六大原则。简称:SOLID
  8. 去哪儿网显示服务器错误,信息去哪儿了
  9. 地质地貌卫星影像集锦(二 地质构造篇)
  10. 深度linux运行卡顿,Deepin(深度操作系统)解决老电脑卡顿,慢等问题