Java多线程几种实现方式
1、继承Thread类
继承类必须重写 run() 方法,该方法是新线程的入口点。它也必须调用 start() 方法才能执行。该方法尽管被列为一种多线程实现方式,但是本质上也是实现了 Runnable 接口的一个实例。
1 | public class ThreadTest { |
1 | // 通过匿名类创建 |
2、实现Runnable接口
为了实现 Runnable,一个类只需要执行一个方法调用 run(),声明如下:
public void run()
1 | public class ThreadTest { |
1 | // 内部匿名类 |
3、通过 Callable 和 Future 创建线程
- 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。
- 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
- 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
- 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。
1 | public class ThreadTest { |
4、创建线程的三种方法对比
- 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。
- 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。
5、线程池
Java中创建和销毁一个线程是比较昂贵的操作,需要系统调用。频繁创建和销毁线程会影响系统性能。于是线程池应运而生。其好处是可以抛出异常和有返回值。
- 创建线程池对象
- 创建Runnable实例
- 提交Runnable实例
- 关闭线程池
1 | // 提交Runnable |
1 | //提交Callable |
参考文章: