Java如何使用多个内核?

时间:2010-12-14 06:15:27

标签: java multithreading parallel-processing

JVM在单个进程中运行,JVM中的线程共享属于该进程的堆。那么JVM如何利用多个内核来提供多个OS线程以实现高并发?

4 个答案:

答案 0 :(得分:27)

您可以使用多个线程来使用多个核心。但是使用比机器中存在的核心数量更多的线程可能只是浪费资源。您可以使用availableProcessors()来获取核心数。

Java 7 中,fork/join framework可以使用多个核心。

相关问题:

答案 1 :(得分:18)

Green threads被Java 1.2中的本机线程所取代。

答案 2 :(得分:18)

如果操作系统通过可用处理器分配线程,Java将受益于多个内核。 JVM本身并没有做任何特别的事情来让它的线程在多个核心上均匀地进行调度。要记住的一些事项:

  • 在实现并行算法时,最好是生成与核心一样多的线程。 (Runtime.getRuntime().availableProcessors())。不多也不少。
  • 利用java.util.concurrent包提供的设施。
  • 确保您的个人图书馆中有Java Concurrency in Practice

答案 3 :(得分:17)

  

JVM在单个进程中运行,JVM中的线程共享属于该进程的堆。那么JVM如何利用多个内核来提供多个OS线程以实现高并发?

Java将利用底层操作系统'如果在多CPU机器上运行,则执行在不同CPU上执行代码的实际工作的线程。当每个Java线程启动时,它会创建一个关联的OS线程,并且OS负责调度等.JVM肯定会对线程和Java语言结构进行一些管理和跟踪,如volatile,{{1} },synchronizednotify()等都会影响操作系统线程的运行状态。

  

JVM在单个进程中运行,JVM中的线程共享属于该进程的堆。

JVM没有必要"在一个进程中运行"因为即使垃圾收集器和其他JVM代码也在不同的线程中运行,操作系统通常将这些不同的线程表示为不同的进程。例如,在Linux中,您在进程列表中看到的单个进程通常伪装成一堆不同的线程进程。即使您使用的是单核计算机,也是如此。

但是,你是正确的,他们都共享相同的堆空间。它们实际上共享相同的整个内存空间,这意味着代码,实习字符串,堆栈空间等。

  

那么JVM如何利用多个内核来提供多个OS线程以实现高并发?

线程从几个方面得到了性能提升。显然,直接并发通常会使程序运行得更快。能够同时执行多个CPU任务可以(但不总是)提高应用程序的吞吐量。您还可以将IO操作隔离到单个线程,这意味着当线程在IO上等待(读/写到磁盘/网络等)时,其他线程可以正在运行。

但就内存而言,由于本地每CPU缓存内存,线程可以获得很多性能提升。当线程在CPU上运行时,CPU的本地高速内存高速缓存可帮助线程在本地隔离存储请求,而无需花时间读取或写入中央内存。这就是wait()volatile调用包含内存同步结构的原因,因为当线程需要协调工作或相互通信时,缓存内存必须刷新到主内存或无效。