如果编写的线程类要继承其他类,但Java又不支持多继承,所以Java还提供了另外一种创建线程的方式,即实现Runnable接口。

      如果线程类直接继承Thread类,其代码结构大致如下:

      从线程类的代码结构可以看出,一个线程的核心代码需要写在run()方法里。也就是说,当线程从就绪状态,通过调度程序分配CPU资源,进入运行状态后,执行的代码即run()方法里面的代码。

      和继承Thread类非常类似,实现Runnable接口的线程类也需要编写run()方法,将线程的核心代码置于该方法中。但是 Runnable 接口并没有任何对线程的支持,因此还必须创建 Thread 类的实例,通过Thread 类的构造函数来创建线程类。

    6.2.2 多线程使用

      下面的例子,分别使用继承Thread类和实现Runnable接口两种方式创建了两个线程类,并通过调用start()方法启动线程。具体程序代码如下:

      编译、运行程序,运行结果如图6.3所示。因为程序中的注释已对程序进行了详细的描述,这里不再展开解释。


    图6.3 多线程程序

      程序中,要想启动一个线程,都是通过调用start()方法来启动的,使线程进入就绪状态,等待调度程序分配CPU资源后进入运行状态,执行run()方法里的内容。作为程序员,是不是可以直接调用run()方法,使这个线程运行起来呢?答案是:可以,但也不可以。所谓可以是指的确能直接调用run()方法执行run()方法里的代码,但这只是串行执行run()方法,并没有启动一个线程,让该线程与其他线程并行执行。

      在main()方法里的t2.start();代码后增加一句t2.run();,再次编译、运行程序,会发现“我的线程2”输出2次,其中一次是通过t2.start()方法启动线程,执行run()方法输出的,另外一次是直接调用t2.run()方法输出的。