一个类只要继承了 Thread 类同时覆写了本类中的 run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,而实现 Runnable 不受这个的约束 。
Thread
例子 1:
public class demo { public static void main(String[] args){ ThreadDemo d1 = new ThreadDemo("syy"); ThreadDemo d2 = new ThreadDemo("qb"); d1.start(); d2.start(); } } class ThreadDemo extends Thread { private String name; ThreadDemo(String name){ this.name = name; } public void run(){ for(int x=1;x<10;x++) System.out.println(Thread.currentThread().getName()+" "+name +"===="+x); } }
此时输出的结果可能为线程 0、1 的来回切换
如果调用 d1.run()来"启动"线程,发现并没有来回切换。启用多线程时我们使用 start()方法,在 JDK 的文档中可以发现,一旦调用 start()方法,则会通过 JVM 找到 run()方法。
public class Thread extends Object implements Runnable
发现 Thread 类也是 Runnable 接口的子类。
*是重写 run 方法
Runnable
例 2:
public class demo { public static void main(String[] args){ RunnableDemo r1 =new RunnableDemo("syy"); RunnableDemo r2 = new RunnableDemo("q"); new Thread(r1).start(); new Thread(r2).start(); } } class RunnableDemo implements Runnable { private String name; RunnableDemo(String name){ this.name = name; } public void run() { // TODO Auto-generated method stub for(int x=1;x<10;x++) System.out.println(Thread.currentThread().getName()+" "+name +"===="+x); } }
实现效果与例 1 相同。
使用 Runnable 定义的子类中没有 start()方法通过 Thread 类来启动 Runnable 实现的多线程.
Runnabe 的好处:
- 避免点继承的局限,一个类可以继承多个接口。
- 适合于资源的共享
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于