官方声明了两种
一种是继承Thread类,一种是实现Runnable方法
//用Thread实现线程
public class ThreadStyle extends Thread{
@Override
public void run() {
System.out.println("用Thread实现线程");
}
public static void main(String[] args) {
new ThreadStyle().run();
}
}
//用Runnable方法实现线程
public class RunnableStyle implements Runnable{
public static void main(String[] args) {
Thread thread = new Thread(new RunnableStyle());
thread.start();
}
@Override
public void run() {
System.out.println("用Runnable方法实现线程");
}
}
一般来说我们选择实现Runnable方法
1.从代码架构角度:具体的任务(run方法)应该和“创建和运行线程的机制(Thread类)”解耦,用runnable对象可以实现解耦。
2.使用继承Thread的方式的话,那么每次想新建一个任务,只能新建一个独立的线程,而这样做的损耗会比较大(比如重头开始创建一个线程、执行完毕以后再销毁等。如果线程的实际工作内容,也就是run()函数里只是简单的打印一行文字的话,那么可能线程的实际工作内容还不如损耗来的大)。如果使用Runnable和线程池,就可以大大减小这样的损耗。
3.继承Thread类以后,由于Java语言不支持双继承,这样就无法再继承其他的类,限制了可扩展性。
准确的讲,创建线程只有一种方式那就是构建Thread类,而实现线程的执行单元有两种方式
本质:
实现Runnable是运行了run方法 最终调用 targer.run()
继承Thread是重写了run方法 重写了整个run()方法