background image

超线程多核心下的 Java 多线程编程技术分析

在引入 Java 多线程技术后,几乎所有应用程序的开发在性能上都得到了很大的改进。本
文将通过探讨超线程技术以及新出现的多核心 Intel 处理器技术来分析这些线程技术是怎
样成为 Java 编程的一个标准部分的。
  一、Java 环境下的多线程技术
  构建线程化的应用程序往往会对程序带来重要的性能影响。例如,请考虑这样一个程
序,它从磁盘读取大量数据并且在把它们写到屏幕之前处理这些数据(例如一个 DVD 播
放器)。在一个传统的单线程程序(今天所使用的大多数客户端程序)上,一次只有一个任
务执行,每一个这些活动分别作为一个序列的不同阶段发生。只有在一块已定义大小的数
据读取完成时才能进行数据处理。因此,能处理数据的程序逻辑直到磁盘读操作完成后才
得到执行。这将导致非常差的性能问题。
  在一个多线程程序中,可以分配一个线程来读取数据,让另一个线程来处理数据,
而让第三个线程把数据输送到图形卡上去。这三个线程可以并行运行;这样以来,在磁盘
读取数据的同时仍然可以处理数据,从而提高了整体程序的性能。许多大量的示例程序都
可以被设计来同时做两件事情以进一步提高性能。Java 虚拟机(JVM)本身就是基于此原因
广泛使用了多线程技术。
  本文将讨论创建多线程 Java 代码以及一些进行并行程序设计的最好练习;另外还介
绍了对开发者极为有用的一些工具和资源。篇幅所限,不可能全面论述这些问题,所以我
想只是重点提一下极重要的地方并提供给你相应的参考信息。
  二、线程化 Java 代码
  所有的程序都至少使用一个线程。在 C/C++和 Java 中,这是指用对 main()的调用
而启动的那个线程。另外线程的创建需要若干步骤:创建一个新线程,然后指定给它某种
工作。一旦工作做完,该线程将自动被 JVM 所杀死。
  Java 提供两个方法来创建线程并且指定给它们工作。第一种方法是子类化 Java 的
Thread 类(在 java.lang 包中),然后用该线程的工作函数重载 run()方法。下面是这种方
法的一个示例:
  public class SimpleThread extends Thread {
  public SimpleThread(String str) {
  super(str);
  }
  public void run() {
  for (int i = 0; i < 10; i++) {
  System.out.println(i + " " + getName());
  try {
  sleep((long)(Math.random() * 1000));
  } catch (InterruptedException e) {}
  }
  System.out.println("DONE! " + getName());