Runnable接口新理解:线程与线程任务的关系
首先来回顾一下java多线程的最基本的知识:
1、Runnable接口介绍
@FunctionInterface
public interface Runnable{
public void run();
}
Runnable接口只定义了一个run()方法,也是一个函数式接口,可以通过实现它来创建线程。
2、创建线程的几种方式
Java 提供了三种创建线程的方法:
- 通过实现 Runnable 接口
- 实现Runnbale接口,重写run()方法,然后通过new Thread(Runnable target, String tName)来创建一个线程,将自己实现的Runnable对象传入参数target,指定一个线程名,再调用Thread的start()方法来启动线程。
- 通过继承 Thread 类本身
- 继承Thread,重写run()方法,调用start()方法启动线程。
- 通过 Callable 和 Future 创建线程
- 1. 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。
- 2. 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
- 3. 使用 FutureTask 对象作为 Thread 对象的 target 创建线程,调用start()方法启动线程。
- 4. 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。
Runnable接口本质是什么?
以上两点是线程的基本知识,在上述三种创建线程的方式中都有一个共同点,就是都要调用Thread的start()方法来启动线程。那么Runnable接口的作用到底是什么?是解耦——将线程与线程任务进行解耦。run()方法内的逻辑实际上只是线程要执行的任务,实现Runnable接口的子类并不具备启动一个线程的能力,JVM中要启动线程必须通过调用Thread的start()方法,如果直接调用run()方法则只是一种普通的方法调用。
所以,在学习多线程技术的时候要分清楚:什么是线程,什么是线程任务。