今天在学习多线程的时候,了解了 创建线程的几种方式,然后就脑子发热,突然想到 Thread 和 Runnable 创建线程有什么区别吗?毕竟是长得都不一样。所以我就找了一些资料(CSDN 大佬们的文章)来看看,有了一些理解。
明确一点:
Runnable
和Thread
本质上是没有区别的。
区别
如果非要说区别的话,那么就有一下几点
- Runnable 和 Thread 创建线程的方式不一样
- Runnable 是接口,Thread 是实体类,Thread 和 Runnable 的关系就是实体与实现的关系。
- 在使用上,如果有复杂的线程操作需求,那就选择继承Thread,如果只是简单的执行一个任务,那就实现Runnable 。
先来看一下Runnable 源码
只有一个简单的 run();
方法;
这个 run 不仅能 run 线程,还有其他东西也能 run(这个是目前的理解,至于其他东西是什么,我也无法举例)
而设置 Runnable 接口的目的就在于:Java 中只能实现单继承,而可以实现多个接口。如果某个类想 run,还行实现其他的,那么就可以通过实现 Runnable 接口完成 run,再实现其他接口或者继承其他类完成 多功能。
如果通过 Runnable 接口创建一个线程,那么应该是这样
class MyThread implements Runnable {
@Override
public void run() {
System.out.println("实现 Runnable 节后后创建线程");
}
}
public class Test{
// 方法 1 : 通过继承 Runnable 创建线程
public static void main1(String[] args) {
// 向上转型 父类引用指向子类对象
Runnable myThread = new MyThread ();
Thread thread = new Thread(myThread);
thread.start();
}
// 方法 2 : 通过 Runnable 匿名内部类创建线程
public static void main2(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable 匿名内部类创建线程");
}
});
thread.start();
}
}
通过继承 Thread 创建线程
class MyThread extends Thread {
@Override
public void run() {
System.out.println("继承 Thread 接口创建线程");
}
}
public class TestDemo2 {
// 方法 1 : 继承 Thread 类创建线程
public static void main1(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
// 方法 2 : 匿名内部类创建线程
public static void main2(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("Thread 匿名内部类创建线程");
}
};
thread.start();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix