(1)继承 Thread 类:但 Thread 本质上也是实现了 Runnable 接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。这种方式实现多线程很简单,通过自己的类直接 extend Thread,并复写 run()方法,就可以启动新线程并执行自己定义的 run()方法。例如:继承 Thread 类实现多线程,并在合适的地方启动线程
(2)实现 Runnable 接口的方式实现多线程,并且实例化 Thread,传入自己的 Thread 实例,调用 run( )方法
(3)使用 ExecutorService、Callable、Future 实现有返回结果的多线程:ExecutorService、Callable、Future这 个 对 象 实 际 上 都 是 属 于 Executor 框 架 中 的 功 能 类 。返回结果的线程是在 JDK1.5 中引入的新特征,可返回值的任务必须实现Callable 接口,类似的,无返回值的任务必须 Runnable 接口。执行 Callable 任务后,可以获取一个 Future 的对象,在该对象上调用 get 就可以获取到 Callable 任务返回的 Object了,再结合线程池接口ExecutorService 就可以实现传说中有返回结果的多线程了。