Thread是一个类
Runnable是一个接口
Thread.java源码
public
class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}
private volatile String name;
private int priority;
private Thread threadQ;
private long eetop;
Runnable.java源码
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
可以看到Runnable
只有一个run()
方法,它没有多线程的能力
继承Thread创建线程
新建一个MyThread
类
public class MyThread extends Thread {
private String name;
MyThread(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Thread start: " + this.name + ",i=" + i);
}
}
}
新建一个ThreadDemo
类
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt1 = new MyThread("thread1");
MyThread mt2 = new MyThread("thread2");
MyThread mt3 = new MyThread("thread3");
mt1.start();
mt2.start();
mt3.start();
}
}
运行结果
Thread start: thread1,i=0
Thread start: thread1,i=1
Thread start: thread1,i=2
Thread start: thread1,i=3
Thread start: thread1,i=4
Thread start: thread1,i=5
Thread start: thread1,i=6
Thread start: thread1,i=7
Thread start: thread1,i=8
Thread start: thread1,i=9
Thread start: thread3,i=0
Thread start: thread3,i=1
Thread start: thread3,i=2
Thread start: thread3,i=3
Thread start: thread3,i=4
Thread start: thread3,i=5
Thread start: thread3,i=6
Thread start: thread3,i=7
Thread start: thread3,i=8
Thread start: thread3,i=9
Thread start: thread2,i=0
Thread start: thread2,i=1
Thread start: thread2,i=2
Thread start: thread2,i=3
Thread start: thread2,i=4
Thread start: thread2,i=5
Thread start: thread2,i=6
Thread start: thread2,i=7
Thread start: thread2,i=8
Thread start: thread2,i=9
可以看到,thread并没有按照start的顺序去执行。所以继承Thread可以实现多线程的能力
实现Runnable创建线程
我们刚才知道,Runnable
只有run
方法,无法去创建线程。
但是Thread
类中有一个构造函数,可以传入Runnable的子类实例。可以通过Thread启动Runnable实现多线程
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
创建MyRunnable
类
public class MyRunnable implements Runnable{
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Thread start: " + this.name + ",i=" + i);
}
}
}
创建RunnableDemo
类
public class RunnableDemo {
public static void main(String[] args) {
MyRunnable mr1 = new MyRunnable("runnable1");
MyRunnable mr2 = new MyRunnable("runnable2");
MyRunnable mr3 = new MyRunnable("runnable3");
Thread t1 = new Thread(mr1);
Thread t2 = new Thread(mr2);
Thread t3 = new Thread(mr3);
t1.start();
t2.start();
t3.start();
}
}
运行结果
Thread start: runnable1,i=0
Thread start: runnable2,i=0
Thread start: runnable2,i=1
Thread start: runnable2,i=2
Thread start: runnable2,i=3
Thread start: runnable2,i=4
Thread start: runnable2,i=5
Thread start: runnable2,i=6
Thread start: runnable2,i=7
Thread start: runnable2,i=8
Thread start: runnable2,i=9
Thread start: runnable1,i=1
Thread start: runnable1,i=2
Thread start: runnable1,i=3
Thread start: runnable1,i=4
Thread start: runnable1,i=5
Thread start: runnable1,i=6
Thread start: runnable1,i=7
Thread start: runnable1,i=8
Thread start: runnable1,i=9
Thread start: runnable3,i=0
Thread start: runnable3,i=1
Thread start: runnable3,i=2
Thread start: runnable3,i=3
Thread start: runnable3,i=4
Thread start: runnable3,i=5
Thread start: runnable3,i=6
Thread start: runnable3,i=7
Thread start: runnable3,i=8
Thread start: runnable3,i=9