代码之家  ›  专栏  ›  技术社区  ›  Rafe Kettler

Java支持多核处理器/并行处理吗?

  •  35
  • Rafe Kettler  · 技术社区  · 14 年前

    我知道现在大多数处理器有两个或更多的核心,多核编程是风靡一时。Java中有没有利用这个功能?我知道Java有一个线程类,但我也知道这是在多核变得流行之前的很长一段时间。如果我能在Java中使用多核,我会使用什么类/技术?

    5 回复  |  直到 14 年前
        1
  •  42
  •   Jonik    14 年前

    Java支持多核吗 处理器/并行处理?

    对。它还为其他编程语言提供了一个平台,其中的实现增加了“真正的多线程”或“真正的线程”卖点。这个 G1 Garbage Collector 在较新的版本中引入了多核硬件。

    Java并发编程实战

    Java Concurrency in Practice 书。


    Java,我需要什么类/技术

    java.util.concurrent

    实用程序类 常用于 包括一些小的 可扩展框架,以及一些 提供有用信息的类 功能和其他 乏味的或难以实施的。 以下是对

    Executor 是一个简单的标准化接口,用于定义自定义的类线程子系统,包括线程池、异步IO和轻量级任务框架。

    队列

    ConcurrentLinkedQueue 类提供了一个高效的可扩展线程安全的非阻塞FIFO队列。

    这个 TimeUnit 类提供了多个粒度(包括纳秒),用于指定和控制基于超时的操作。包中的大多数类都包含基于超时和无限等待的操作。

    同步化器

    Semaphore 是一个经典的并发工具。 CountDownLatch 是一个非常简单但非常常见的实用程序,用于在给定数量的信号、事件或条件保持之前进行阻塞。[…]

    并发集合

    除了队列之外,此包还提供了一些为在多线程上下文中使用而设计的集合实现: ConcurrentHashMap , CopyOnWriteArrayList ,和 CopyOnWriteArraySet .


    int n = Runtime.getRuntime().availableProcessors();
    
        2
  •  9
  •   Gian    14 年前

    操作系统线程比商品多核系统早了很长一段时间,所以这并不是一个真正的问题。多核系统的唯一区别是允许时间复用的操作系统线程作为多核上真正的并发线程执行。

        3
  •  8
  •   Richard Kettelerij    14 年前

    Java5引入了Java.util.concurrent包,它有助于构建可从多核系统获益的并发应用程序。这个包远远超出了Java1.4和更早版本中提供的多线程功能(如synchronized、wait、notify等)。

    java7有一个提议,要包含 Fork/Join 使多核系统更容易使用的框架。

        4
  •  2
  •   Patrick Viry    14 年前

    你会发现 Ateji PX中的功能,Java语言的一个扩展,带有受pi演算启发的并行原语。与线程编程和基于线程的一切(任务、执行器等)完全不同。

    这种方式在语言级引入的并行性,与线程库相反,线程库提供了对硬件级概念的API访问,使得多核编程更加简单和直观。

    这是一种全新的并行编程方法,值得一读(免责声明:我是Ateji PX的设计者)。白皮书如下: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf

        5
  •  0
  •   Community Bayu Bramantya    7 年前

    对。Java提供 concurrent API

    您可以从运行时获取可用处理器计数,并使用该计数创建 ExecutorService Executors .

    你也可以使用 ThreadPoolExecutor API实现的。

    Java8提供了另一个API:newWorkStealingPool,它使用所有可用的处理器创建ForkJoinPool。不必将处理器计数作为参数传递。

    int processorCount = Runtime.getRuntime().availableProcessors();
    
    ExecutorService executor1 = Executors.newFixedThreadPool(processorCount);
    ExecutorService executor2 =  
                                Executors.newScheduledThreadPool(processorCount);
    ExecutorService executor3 = Executors.newWorkStealingPool(); // java-8 API
    ForkJoinPool forkJoinPool = new ForkJoinPool(processorCount);
    

    查看相关SE问题权利执行人:

    Java's Fork/Join vs ExecutorService - when to use which?