目录
一.通过继承Thread来创建线程
new MyThread01().start();
- 定义子类继承Thread类。
- 子类中重写Thread类中的run方法。
- 创建Thread子类对象,即创建了线程对象。
- 调用线程对象start方法:启动线程,调用run方法。
package nsu.myllxy;
public class ThreadTest01 {
public static void main(String[] args) {
ThreadTestDemo01 threadTestDemo01 = new ThreadTestDemo01();
threadTestDemo01.start();
}
}
class ThreadTestDemo01 extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
要再启动一个线程,只能创建新线程对象,同一个线程对象不能start两次,会报错:Exception in thread "main" java.lang.IllegalThreadStateException
如不能:
ThreadTestDemo01 threadTestDemo01 = new ThreadTestDemo01();
threadTestDemo01.start();threadTestDemo01.start();
调用start后,threadTestDemo01.getState()会从NEW转为RUNNABLE
二.通过实现Runnable来创建线程
new Thread(new MyThread02()).start();
- 定义子类,实现Runnable接口。
- 子类中重写Runnable接口中的run方法。
- 通过Thread类含参构造器创建线程对象。
- 将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中。
- 调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。
package nsu.myllxy;
public class ThreadTest02 {
public static void main(String[] args) {
new Thread(new ThreadTestDemo02()).start();
}
}
class ThreadTestDemo02 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
三.继承方式和实现方式的联系与区别
使用实现方式时,在源码中:
这个时候,Thread类是没有被重写的,因此我们可以调用Thread中的run方法,逻辑如下所示:
如:
Runnable dm02 = new ThreadTestDemo02()
new Thread(dm02 ).start();
new Thread(dm02 ).start();
结论:开发中,优先选择实现runnable接口的方式。