Runnable 是接口
Thread 是类,且实现(implement)了Runnable接口
Thread源码:
public class Thread
implements Runnable
{
private static class Caches
{
static final ConcurrentMap subclassAudits = new ConcurrentHashMap();
static final ReferenceQueue subclassAuditsQueue = new ReferenceQueue();
Runnable源码
public interface Runnable
{
public abstract void run();
}
Thread类,有一个构造方法:public Thread(Runnable targer)
public Thread(Runnable runnable)
{
daemon = false;
stillborn = false;
threadLocals = null;
inheritableThreadLocals = null;
threadStatus = 0;
blockerLock = new Object();
init(null, runnable, (new StringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L);
}
此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程
使用情况
在程序开发中只要是多线程肯定永远以实现Runnable接口为主
因为接口的实现可以实现多个,而类的继承只能是单继承。因此在开辟新线程时能够使用Runnable接口就尽量不要使用从Thread类继承的方式来开辟新的线程。
实现Runnable接口相比继承Thread类有如下好处:
1、避免继承的局限,一个类可以继承多个接口
2、适合于资源的共享
测试代码
继承Thread类
package com.xzf.test;
public class ExtendThread {
public static void main(String args[]) {
Runnable2 r2 = new Runnable2();
r2.start();
for (int i = 0; i < 10; i++) {
System.out.println("Main:"+i);
}
}
}
/*class Runnable2 extends Thread { */ 因为Threaed方式实现了Runnable接口,所以可以直接继承Thread,不过run方法依旧要写的
class Runnable2 extends Thread implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Runnable2:"+i);
}
}
}
实现Runnable接口
package com.xzf.test;
public class RunnableDemo{
public static void main(String args[]) {
Runnable1 r1 = new Runnable1();//new 一个新的线程对象
// r1.run();//对run方法进行调用,直到走完run方法再继续走main方法
Thread thread = new Thread(r1);//要启动一个新的线程就必须new一个Thread对象出来
thread.start();//启动新开辟的线程,执行run方法,和main方法并行
for(int i=0;i<10;i++) {
System.out.println("Mainthread:" + i);
}
}
}
class Runnable1 implements Runnable{
public void run() {
for(int i=0;i<10;i++) {
System.out.println("Runnable:" + i);
}
}
}