Java 中实现线程的方式有两种:继承 Thread
类和实现 Runnable
接口
继承 Thread
类的方式实现线程
public class Main {
public static void main(String[] args) {
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Hello, I am a thread!"); // 线程执行的逻辑
}
}
MyThread t = new MyThread();
t.start();
}
}
实现 Runnable
接口的方式实现线程
这里需要注意的是在使用实现 Runnable
接口的方式实现线程时,确实需要创建一个 Thread
对象来启动线程,但这并不意味着 Java 实现线程的本质只有一种方式,因为 Thread
类本质上只是一个线程执行的容器。
public class Main {
public static void main(String[] args) {
// Runnable 是函数式接口,可以使用 Lambda 表达式构造对象
Runnable r = () -> {
System.out.println("Hello, I am a thread!"); // 线程执行的逻辑
};
Thread t = new Thread(r);
t.start();
}
}
实现 Callable
接口和使用 Future
实现线程
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable<String> callable = () -> {
return "Hello, I am a thread!";
};
FutureTask<String> task = new FutureTask<>(callable); // 事实上 FutureTask 实现了 Future 和 Runnable 接口
Thread t = new Thread(task);
t.start();
System.out.println(task.get());
}
}
Executors
是怎么实现线程的(线程池是怎么实现线程的)?
Executors
使用的是实现 Runnable
接口的方式实现线程,它提供了一种方便的方式来创建和管理线程池,可以使用 Executors
工厂方法创建不同类型的线程池。
结论
使用实现 Runnable
接口的方式实现线程更加灵活,因为它可以避免单继承的限制,同时也可以更好地实现线程池等高级特性。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。