我知道现在大多数处理器都有两个或更多核心,多核编程非常流行。Java中是否有利用此功能的方法?我知道Java有Thread类,但是我也知道这个类早在多核变得流行之前就存在了。如果我想在Java中利用多个核心,我应该使用哪个类/技术?
我知道现在大多数处理器都有两个或更多核心,多核编程非常流行。Java中是否有利用此功能的方法?我知道Java有Thread类,但是我也知道这个类早在多核变得流行之前就存在了。如果我想在Java中利用多个核心,我应该使用哪个类/技术?
Java是否支持多核处理器/并行处理?
是的。它也成为其他编程语言的平台,其中实现添加了“真正的多线程”或“真实线程”的卖点。在新版本中引入的G1垃圾收集器也利用了多核硬件。
尝试获取一本Java并发编程实战书籍。
java.util.concurrent
实用类通常在并发编程中使用。该包含一些小型标准化可扩展框架,以及一些提供有用功能且其他情况下繁琐或难以实现的类。以下是主要组件的简要描述。
执行器
Executor
是一个简单的标准化接口,用于定义自定义线程子系统,包括线程池、异步IO和轻量级任务框架。
队列
java.util.concurrent ConcurrentLinkedQueue
类提供了一个高效可扩展的线程安全非阻塞FIFO队列。
计时
TimeUnit
类提供多个粒度(包括纳秒)来指定和控制基于超时的操作。该包中的大多数类都包含基于超时的操作,以及无限等待。
同步器
四个类帮助常见的特殊目的同步习语。 Semaphore
是一种经典的并发工具。 CountDownLatch
是一种非常简单但非常常见的实用程序,可阻塞直到给定数量的信号、事件或条件保持。
并发集合
除了队列之外,该包还提供了一些集合实现,设计用于多线程上下文中使用:ConcurrentHashMap
、CopyOnWriteArrayList
和CopyOnWriteArraySet
。
如果你想将线程数与可用CPU数量匹配,这也非常方便:
int n = Runtime.getRuntime().availableProcessors();
是的。Java提供并发API以利用机器的多核处理器优势。
您可以从Runtime获取可用处理器数量,并使用该数量通过Executors中的许多API创建ExecutorService。
您还可以使用ThreadPoolExecutor API来实现相同的功能。
Java 8提供了一个新的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问题:正确的执行器: