
第一,创建一个类,继承Thread类,并复写run方法。需要启动一个新的线程时,首先创建该类的对象,然后调用start()方法,就可以使新线程进入就绪状态;
第二,创建一个类,实现Runnable接口,并实现该接口当中的run方法。需要启动一个新的线程时,首先创建一个该类的对象,调用Thread类的构造函数,将该对象作为构造函数的参数传递进去,然后再调用Thread对象的start()方法,就可以使新线程进入就绪状态。
两都区别:从本质上讲,Runnable是JAVA语言中用以实现线程的接口,任何实现线程功能的类都必须实现这个接口。Thread类就是因为实现了Runnable接口,所以继承它的类才具有了相应的线程功能。但是由于在java语言中,只能继承一个类,如果用户定义的类已经继承了其他类,就无法再继承Thread类,也就无法使用线程,于是java语言为用户提供了一个接口,java.lang.Runnable,实现Runnable这个接口与继承Thread类具有相同的效果,通过实现这个接口就可以使用线程。
继承Thread类
package com.fit.demo;
public class SimpleThread extends Thread {
public SimpleThread(String name) {
setName(name);
}
public void run() {
int i = 0;
while (i++ < 5) {
System.out.println(getName() + "执行步骤" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
SimpleThread thread1 = new SimpleThread("线程1");
SimpleThread thread2 = new SimpleThread("线程2");
thread1.start();
thread2.start();
}
}
结果:
线程1执行步骤2
线程2执行步骤2
线程1执行步骤3
线程2执行步骤3
线程1执行步骤4
线程2执行步骤4
线程1执行步骤5
线程2执行步骤5
实现Runnable接口
package com.fit.demo;
public class SimpleRunnable implements Runnable {
@Override
public void run() {
int i=5;
while(i-->=1){
System.out.println("*");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread thread1 = new Thread(new SimpleRunnable(),"线程1");
thread1.start();
}
}
结果:
*****
