Java中的并行性

时间:2011-01-05 15:07:17

标签: java concurrency parallel-processing java.util.concurrent

是否有像Java中的Intel TBB这样的库支持Parallelism。

6 个答案:

答案 0 :(得分:8)

也许你可以澄清一下你究竟在寻找什么

  

英特尔®线程构建模块(英特尔TBB)提供了一种丰富而完整的方法来表达C ++程序中的并行性。它是一个库,可帮助您利用多核处理器性能,而无需成为线程专家。英特尔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(线程本地分配缓冲区)并且是透明的。我怀疑大多数Java开发人员甚至不知道它们存在。

在Future对象中捕获结果和异常,您可以稍后检查。

您可以拥有“条件变量”,例如CountdownLatch或CyclicBarrier

  

一个模仿C ++ 0x unordered_map的新容器,它基于英特尔(TBB 3.0)和Microsoft(Visual Studio 2010)实现的联合规范。它比以前的concurrent_hash_map有三个优点:

  • 与C ++ 0x unordered_map
  • 非常相似的界面
  • 允许并发插入和遍历。
  • 界面未暴露任何锁定。实现可以在内部使用锁,但锁定永远不会以可能导致死锁的方式暴露。它可能在内部持有锁,但从不在调用用户定义的代码时。

Java的ConcurrentHashMap支持ConcurrentMap和Map接口,允许并发插入和遍历,并且不公开任何锁。 ;)至少9岁,所以你知道它应该是健壮和稳定的。

如果您愿意,可以在线程池中使用PriorityQueue。

答案 1 :(得分:6)

这个主题有一本好书:

Java Concurrency in Practice

Java Concurrency in Practice

答案 2 :(得分:4)

自Java5以来,java.util.concurrent包中提供了它。

该版本包括对Java内存模型的重大改进,以巩固并发编程的基础并修复已知问题。在Java中,并发性从一开始就被设计到语言中,而不是稍后在库中添加。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

查看java.util.concurrent包。它有一大堆类对并行编程很有用。

顺便说一下,你应该考虑接受一些答案。没有被接受的答案的15个问题阻碍了人们回答你的问题。

答案 5 :(得分:0)

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