Java中的并行性

4

是否有类似于Intel TBB的支持并行处理的Java库。


2
请注意:您可以通过在每个问题旁边点击复选标记来接受答案。 - jzd
6个回答

8
也许您可以澄清一下您正在寻找什么。
Intel® Threading Building Blocks(Intel TBB)提供了一种丰富而完整的方法来表达C++程序中的并行性。它是一个库,帮助您利用多核处理器性能,而无需成为线程专家。 Intel TBB不仅是一个线程替换库。它代表了更高级别的基于任务的并行性,抽象出平台细节和线程机制以实现可伸缩性和性能。
自1998年以来,并发库已经做到了这一点,并在2004年成为Java 5.0的一部分。
编辑:假设您想要一个线程池,它可以使用系统上的所有逻辑处理器。
ExecutorService es = Executors.newFixedThreadPool(
      Runtime.getRuntime().availableProcessors);

// to add a number of tasks
for(int i=0; i<numberOfTasks; i++) {
   es.submit(new Callable<ResultType>() {
      public ResultType call() {
          return doWork(i);
      }
   }
}

这将在每个空闲线程上执行doWork。
看起来,它的特点非常熟悉。
我查看了一些低级优化,比如线程感知内存分配。在Java中,这被称为TLAB(Thread Local Allocation Buffers),并且是透明的。我怀疑大多数Java开发人员甚至不知道它们的存在。
结果和异常会被捕获到一个Future对象中,您可以稍后检查它们。
您可以拥有“条件变量”,例如CountdownLatch或CyclicBarrier。
引用:
一个新的容器,模仿C++ 0x unordered_map,并基于由Intel(TBB 3.0)和Microsoft(Visual Studio 2010)共同实现的规范。它比以前的concurrent_hash_map具有三个优点:
接口与C++0x unordered_map非常相似
允许并发插入和遍历。
接口没有暴露任何锁定。实现可能在内部使用锁定,但锁定从未以可能导致死锁的方式公开。它可能在调用用户定义的代码时保持锁定状态,但从不同时保持锁定状态。
Java的ConcurrentHashMap支持ConcurrentMap和Map接口,允许并发插入和遍历,而且不会暴露任何锁定。 ;) 它至少有9年历史,所以您知道它应该是健壮和稳定的。
如果您愿意,可以在线程池中使用PriorityQueue。

是的,我正在寻找多核处理器和多处理器应用程序的优势。 - Kamahire
1
+1 推荐尝试使用Intel TBB。乍一看,它与java.util.concurrent框架非常相似,可以抽象出线程、wait/notify等底层细节,并允许我们使用更高级别的构建块,如Executor、作业队列和Callable。 - Péter Török
1
我怀疑它可能不完全做同样的事情,但是我相信它的对象是相同的,因此可以用它来代替TBB。 - Peter Lawrey
@Kamahire,值得记住的是,自Java 1.0版本以来,它直接支持线程,因此它可能可以满足您的需求,无需使用额外的库。 - Peter Lawrey

6
这个主题有一本很好的书:
Java Concurrency in Practice

Java Concurrency in Practice


1
我相信并发与并行是不同的。请仔细阅读英特尔TBB库。 - Kamahire
1
虽然这不是对问题的直接回答,但是我强烈推荐这本书,它详细解释了如何使用Java5/6中提供的并发构造。 - Péter Török

4

这个功能在Java5之后的java.util.concurrent包中提供。

Java5版进行了主要的Java内存模型大修,以巩固并发编程基础和解决已知问题。在Java中,并发性从一开始就被设计到语言中,而不是仅仅添加到库中。


我相信并发与并行是不同的。请仔细阅读英特尔TBB库。 - Kamahire
2
也许您可以澄清一下您想要的区别是什么? - Peter Lawrey

1

看看akka吧,它使用Actor和软件事务内存提供并发框架。当然,这只是提供了构建块,你仍然需要能够编写一些并发代码,但这变得更容易了。


0

请查看 java.util.concurrent 包。它有许多对于并行编程非常有用的类。

顺便说一下,您应该考虑接受一些答案。15个问题没有被接受的答案会让人们不愿意回答您的问题。


0

有些人问关于并发和并行的区别。并发意味着不同的程序模拟同时运行,调度程序决定哪个程序正在运行。并行意味着将一个程序分成任务,并在不同的核心上同时运行这些任务以解决问题。当这些任务与其他程序竞争资源时(我们有更多的任务比可用的核心),那么我们就同时具有并发性和并行性。避免竞态条件是并行性中较不困难的部分,大问题是找到一种良好的方法来适当地分解任务以获得良好的结果。非常细粒度的分解有缺点(开销),但粗粒度的并行性(单任务)也有缺点(您没有使用计算机上所有可用的处理能力)。您必须找到中期,这意味着要做一些优化问题(数学)。


2
这根本不是问题的答案。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接