首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 7中实现并发和并行

在Java 7中实现并发和并行
EN

Stack Overflow用户
提问于 2012-08-31 11:10:35
回答 2查看 569关注 0票数 3

作为我正在做的一项研究的一部分,我正在探索使用Scala和Clojure等语言在JVM上实现并发的所谓简单性。简而言之,我希望证明这些语言提供的并发构造比Java7提供的更容易。

因此,我希望能找到一些很好的参考资料来解释Java并发模型的复杂性。

除了给我指明Google的方向(我已经搜索了有限的成功),如果那些知情的人能为我提供一些很好的参考,让我开始这方面的工作,我将不胜感激。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-08-31 11:13:16

Java不支持lambda表达式。创建一个内联回调(例如,为了完成一个异步调用)需要5行匿名类型的样板。

这强烈地阻止了人们使用回调。这可能就是为什么Java7仍然没有一个接受一个值的回调接口(与RunnableCallbable相反),而C#有一个since 2005的原因。

因此,JDK并不真正支持异步操作。

异步操作的关键是能够启动一个长时间运行的请求,并让它在完成时运行一个回调,而不需要在请求期间消耗一个线程。在Java语言中,您只能通过在Future<V>上创建一个单独的线程调用get()来完成此操作。这将使用标准API的应用程序的并发性限制在您可以正常支持的线程数量上。

为了解决这个问题,Google的Guava框架为更好的Java代码引入了一个ListenableFuture interface,它确实有完成回调。

像Scala这样的语言通过支持lambda表达式( compile to anonymous classes)和添加它们自己的Promise / Future类型来解决这个问题。

票数 1
EN

Stack Overflow用户

发布于 2012-08-31 14:01:11

虽然更高级的语言更容易使用多核,但人们经常忘记的是,为什么要使用多核,这是为了让程序更快,例如增加其吞吐量。

当您考虑增加并发性的选项时,您需要测试这些选项是否真的以某种方式提高了性能。(因为通常不是这样的)

例如,STM (软件事务内存)使得编写多线程应用程序变得更容易,而不必担心并发问题。问题是,对于琐碎的例子,不使用STM而只使用一个线程会更快。

使用多线程会增加复杂性,并使您的应用程序更加脆弱,因此必须有一个很好的理由这样做,否则您应该尽可能坚持使用最简单的解决方案。

有关更多讨论,请访问http://vanillajava.blogspot.co.uk/2011/11/why-concurency-examples-are-confusing.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12208393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档