看起来似乎是一个很大的惊小怪的有关多核和java。虽然有些人说,java支持是不是 不够好, 这似乎是一个区域的期待。看起来似乎 很多 技术 改善性能的并行程序。

任何建/建议有关的编程在多核心方案表示赞赏。

有帮助吗?

解决方案

查看新的Java并发工具(在 java.util.concurrent)它提供了比常规Thread更高级的功能,这将使其更容易(并且更不容易出错)编写并发应用程序。 课程:并发 java.sun.com/docs/books/tutorial/index.html“rel =”noreferrer“> Java教程将是一个很好的起点。

到目前为止,我只使用了 ExecutorService ,允许生成线程池,可以以 Runnable s或 Callable s(执行后可以返回值 Future s),实际的线程代码由submit处理。

例如,使用2个线程的线程池执行一些计算,并获得结果可以很简单:

ExecutorService es = Executors.newFixedThreadPool(2);

Future f1 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Future f2 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Integer firstInteger = f1.get();
Integer secondInteger = f2.get();

在上面(未经测试的)代码中,我不得不担心的是制作一些get s和 f2 将它带到f1以及之后,使用< => s来检索结果。

<=> 方法,如果处理未完成,程序将停止,直到可以检索到<=>的结果。因此,在此示例中,即使<=>的结果在<=>之前可用,程序也会等到<=>的结果可用。

在阅读材料方面,我即将购买的书籍清单是Brian Goetz的 Java Concurrency in Practice ,当Java中的并发性出现时,它经常会出现。

Java 5文档中的并发实用程序页面还有更多的信息。

其他提示

最好的提示必须是:让你的同步正确!

这似乎有些明显,但对 Java内存模型的理解至关重要,尤其是易失性最终字段的工作原理,同步如何充当互斥 内存障碍然后是新的java.util.concurrent构造

总是一个好的提示 - 如果你的大多数课程都是不可变的,那么一切都变得如此简单,因为不变性使人们不必担心从很多地方到很少地方的锁定。

查看即将发布的 fork-join框架。 fork-join框架使开发人员能够在多核架构上实现细粒度的并行性。

此外,您可能需要查看基于JVM的语言,例如 Clojure ,声称可以更轻松地进行多核并行编程。

作为Java自己的共享内存并发方法的替代方法,您还可以查看基于Actor的并发使用Scala 在Java之上,它为并发编程提供了一个更简单的模型。

查看Brian Goetz的演讲从并发到并行。那里提供的技巧不多,但它让您了解Java并发的方向。

你可以尝试使用了并行的模式,诸如图书馆 Skandium 为Java。只需选择的模式并行你想要的填补缺失的挂钩。

一些模式叶在Skandium是:

  • 主从: Farm<P,R>(nested);
  • 管道:`管(阶段1,stage2);
  • 为迭代: For<P,R>(nested, i);
  • 有条件的迭代: While<P,R>(nested, condition);
  • 有条件的支: If<P,R>(condition, trueCase, falseCase);
  • 地图减少: Map<P,R>(split, nested, merge);
  • 地图-减少与不同的代码的路径: Fork<P,R>(split, nested, merge);
  • 递归的鸿沟和征服的: DaC<P,R>(condition, split, nested, merge);

所有模式可以是嵌套的,并结合,这样你就可以拥有的农场内部的分裂和征服,等等。

最佳实用技巧书籍 Java Concurrency in Practice 。对于所有java程序员来说,这是必读的,即使是那些认为他们不进行任何并发编程的人,因为java在其各种库中有许多隐藏的线程(想到了swing,与servlet一样)。

我的提示:了解Java内存模型(自JDK 5及更高版本以来)。大多数人都不知道,同步,volatile和final除了正常的多线程范围之外还有其他意义。

Java适用于多CPU和多核。如果您正确编程并投入大量资金,那么您将获得一个高度并发的服务器系统来使用8核,包括大量同步等等。我们对此感到非常满意...... JDK6比JDK5更好,而且下面的一切都在多CPU机器上糟透了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top