Java 提供了三种创建线程的方法:
通过实现 Runnable 接口;
通过继承 Thread 类本身;
通过 Callable 和 Future 创建线程。
1.方法一通过实现 Runnable 接口:
创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类。实现一个public void run()方法,为主线程,当线程start()之后自动调用run(),在创建一个实现 Runnable 接口的类之后,你可以在类中实例化一个线程对象。
Thread 定义了几个构造方法,下面的这个是我们经常使用的:
Thread(Runnable threadOb,String threadName);
这里,threadOb 是一个实现 Runnable 接口的类的实例,并且 threadName 指定新线程的名字。
新线程创建之后,你调用它(thread)的 start() 方法它才会运行。
void start();
可以把实现接口的类视为一个外包装,真正的线程是thread,线程内容写在run中。使用方法:需要几个线程就实现几个对象,调用对象的start方法。
2.方法二:
创建一个线程的第二种方法是创建一个新的类,该类继承 Thread 类,然后创建一个该类的实例。
继承类必须重写 run() 方法,该方法是新线程的入口点。它也必须调用 start() 方法才能执行。
该方法尽管被列为一种多线程实现方式,但是本质上也是实现了 Runnable 接口的一个实例。
使用方法同上。
方法三:通过 Callable 和 Future 创建线程
-
1. 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体(类比前两中run方法),并且有返回值。
-
2. 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
-
3. 使用 FutureTask 对象作为 Thread 对象的 target (第一个参数)创建并启动新线程。
-
4. 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。
-
5.使用方法可以同上(用this),也可以就在本类的main方法中运行(在main中递归实现本类对象)。