线程的实现方式一般是继承thread类或者实现runnable接口,最近在看Android watchdog的时候发现它是一个线程,但是并没有extends Thread,编译是能过的,并且这是Android framework的源码,肯定是没有问题的,但是不理解,想请教下各位专家为什么可以这样写,我参照的是Android S的源码,代码位置frameworks\base\services\core\java\com\android\server\Watchdog.java
```java
public class Watchdog {
static final String TAG = "Watchdog";
......
private static Watchdog sWatchdog;
private final Thread mThread;
......
private Watchdog() {
mThread = new Thread(this::run, "watchdog");
}
public void start() {
mThread.start();
}
}
```
创建线程一般是这两种方式:继承Thread类和实现Runnable接口
代码中,Watchdog类也没有直接继承Thread类或实现Runnable接口,它也可以创建线程
是因为在Watchdog类的构造函数中,通过new Thread(this::run, "watchdog")创建了一个新的Thread对象,并将一个lambda表达式this::run作为线程的执行体
Java 8以后,引入了lambda,它写接口或函数式接口跟简洁。然后this::run表示使用Watchdog类中的run方法作为线程的执行体。
所以,就算Watchdog类没有直接继承Thread类或实现Runnable接口,但它也能创建一个线程,并在构造函数中通过lambda表达式指定了线程的执行体
当然可以直接使用了, 这相当于 新建了一个类,内部成员变量为一个线程对象, 把线程对象封闭在你的先建的 Watchdog 类,线程对象的行为,由Watchdog 类管理