提示的编码java程序在多核方案[封闭]
-
03-07-2019 - |
解决方案
查看新的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机器上糟透了。