我开始分配读取包含100列和10万行的CSV文件并将其写入数据库。前端
因此我从一个简单的Java程序开始,运行一个while循环直到EOF,而后进行JDBC调用来存储值。这是须要花一个小时才完成了,但后来我意识到程序的运行时比建立程序花费的时间更长。所以,任务并不像看起来那么容易。那能够作些什么呢?固然,我意识到我须要并行完成任务。数据库
线程对我来讲彷佛老是很复杂。“Mutex”,“Semaphores”和“Monitors”的概念让我望而却步。因此我试着理解这个概念。Java使用Monitors来实现同步。Java的Monitors支持两种线程同步:互斥和合做。编程
经过虚拟机对象锁在Java中支持的互斥操做,使多个线程可以独立地处理共享数据而不会相互干扰。合做,是经过等待和通知来实现的。此方法使线程可以朝着共同的目标一块儿工做。bash
当线程到达监视区域的开头时,它将被放入相关监视器的条目集中。这个集就像银行柜台的队列同样。当一我的到达线路前端时,他们就能够进行交易。架构
关于线程的每个讲座或文章老是提到消费者和生产者问题。因此个人问题与此相似,对吧?我有一个读取器(生产者),它读取一行并将其提供给JDBC层(消费者)以将其写入数据库。并发
Java已经提供了阻塞队列,使实现问题更容易。但我不能产生10万个线程来作到这一点。我须要相似线程池的东西来限制线程数。只需一个简单的循环和线程数就能够了。该解决方案看起来很好,在架构上很📃, 而后我意识到我忘记了错误处理。如今我意识到在线程中处理异常很是困难,由于它们不会返回任何内容。他们还有其余任何办法吗?因此,是的,Java 1.5中有“可调用接口”功能,它做为一个线程运行但返回将来。但这是另外一个故事。框架
执行上述任务使我意识到,随着复杂性的增长,维护此代码将很是困难。此外,Java为每一个生成的线程使用系统线程。因此产生线程是有限的。异步
我须要的是一个为我提供并发处理的框架,我只能专一于它的业务逻辑部分。我找到了这样一个框架:Akka。Akka基于Erlang actor模型。若是您阅读上述问题的实现方式,则使用拉策略实现,消费者线程将在完成当前任务后执行新任务。因此咱们须要等到生产者准备好了。若是系统更具反应性,那不是很容易吗?对于每一个事件,事件处理程序都应该准备好完成工做。分布式
所以,与银行相似地进行思考,之前咱们曾常常常站在队列中,银行很难维持这个队列。有时客户厌倦了排队并离开。所以,银行能够作的是将此问题提交给第三方供应商并寻求解决方案。供应商建议使用令牌系统。让全部顾客坐在椅子上,直到他们的代号出现。对于银行而言,这听起来是一个很好的解决方案,而且为了增长锦上添花,供应商甚至准备好免费维护这个系统。想一想银行会感觉到的快乐。在Akka以后,我感觉到了相似的快乐。Akka基于actors,因此actors是什么?性能
actors给你带来:
使用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的感受很是好,比传统线程更快。
公众号:银河系1号
联系邮箱:public@space-explore.com
(未经赞成,请勿转载)