在一次基于多线程的编码测试中,发现继承Runnable接口的线程实现类在运行时并未按预计启动多线程,经分析和比较后,找出问题所现,现将其记录下来,以供分享。
 Java中,多线程编程中的线程编写,有两种方式,即扩展Thread基类或继承Runnable接口;例如:
 public class T extends Thread {
  public void run() {
 ……
 }
 }
 public class R implements Runnable {
  public void run() {
 ……
 }
 }
 对于扩展Thread的实现类T,可以使用T.start()来启动此线程;如
 public static void main(String[] args) {
  Thread t = new T();
 t.start();
 }
 但对于继承Runnable接口的实现类R,因接口中并没有提供直接启动线程的start()方法,只有一个线程主逻辑运行的run()方法。此时,如执行run(),会因为R.run()只是作为此线程实现类的一个方法,并未在主线程之外,启动另一个线程,从而导致R.run()阻断主线程继续向下执行;并未达到多线程运行的目的。
 错误启动代码如下:
 public static void main(String[] args) {
  R r = new R();
 r.run();
 }
 那么,如何使用另外线程来启动继承Runnable接口的实现类呢?以下就是它的正确的使用方式:
 public static void main(String[] args) {
  R r = new R();
 Thread t = new Thread(r);
 t.start();
 }
 此时,需注意,在主线程执行时,需等待子线程执行,否则,当主线程结束后,子线程也将结束。