代码之家  ›  专栏  ›  技术社区  ›  amit

在多核场景中编写java程序的技巧[关闭]

  •  16
  • amit  · 技术社区  · 17 年前

    关于多核和java似乎有很多争论。虽然有人说java支持不是 good enough ,这绝对是一个值得期待的领域 many techniques 以提高并发程序的性能。

    对于在多核场景中进行编程的任何提示/建议,我们都将不胜感激。

    9 回复  |  直到 17 年前
        1
  •  21
  •   coobird    17 年前

    了解新的Java并发设施(在 java.util.concurrent package Thread Lesson: Concurrency 属于的 The Java Tutorials 这将是一个很好的起点。

    ExecutorService ,这使得可以生产 thread pools Runnable Callable Future s) ,实际的线程代码由 执行器服务 .

    例如,使用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();
    

    在上面的(未测试的)代码中,我所要担心的是制作几个 s和 submit 把它送给 执行器服务 未来 s检索结果。

    get 方法 未来 如果处理未完成,程序将停止,直到 未来 f2 之前可用 f1 ,程序将等待以下结果 f1

    在阅读材料方面,我即将购买的书籍清单上有 Java Concurrency in Practice Brian Goetz,在Java中提到并发时经常提到这个问题。

    Concurrency Utilities Java 5文档中的页面也有更多信息。

        2
  •  8
  •   oxbow_lakes    17 年前

    最好的建议应该是: 正确同步!

    这似乎有点明显,但对 Java Memory Model 易变的 田地工作,如何 同步 然后是新的 java.util.concurrent 构造也是

        3
  •  6
  •   mP.    17 年前

        4
  •  3
  •   Julien Chastang    17 年前

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

    Clojure

        5
  •  3
  •   Fabian Steeg    17 年前

    作为Java自己的共享内存并发方法的替代方案,您还可以考虑 Actor-based concurrency using Scala Java为并发编程提供了一个更简单的模型。

        6
  •  2
  •   Bobby    16 年前

    查看Brian Goetz的演讲 From concurrent to Parallel

        7
  •  2
  •   Gilles 'SO- stop being evil'    15 年前

    您可以尝试使用并行模式库,例如 Skandium 对于Java。只需选择您想要的并行模式并填写缺少的钩子。

    Skandium中移植的一些模式是:

    • Farm<P,R>(nested);
    • 管道:`管道(第一阶段、第二阶段);
    • 对于迭代: 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);

        8
  •  1
  •   Chii    17 年前

    Java Concurrency in Practise 。这是所有java程序员的必读之作,即使是那些认为自己不做任何并发编程的人,因为java的各种库中都有许多隐藏的线程(swing浮现在脑海中,servlet也是如此)。

        9
  •  1
  •   ReneS    17 年前

    我的建议:了解Java内存模型(JDK 5及更高版本)。大多数人不知道,同步、volatile和final在正常的多线程范围之外还有额外的意义。

    Java适用于多cpu和多核。如果你正确编程并投入一些精力,你会得到一个高度并发的服务器系统,利用8核,包括大量的同步等。我们对此非常满意……JDK6比JDK5好,下面的一切在多cpu机器上都很糟糕。