1.线程的创建方式一:继承Thread类
1.1步骤:
- 创建一个继承于Thread的子类
- 重写Thread类的run() —>将此线程要执行的操作,声明在此方法体中
- 创建当前Thread的子类的对象
- 通过对象调用start():①启动线程②调用当前线程的run()方法
1.2例题:创建一个分线程1,用于遍历100以内的偶数
public class EvenNumberTest {
public static void main(String[] args) {
PrintNumber t1 = new PrintNumber();
t1.start();
for (int i = 0; i <= 10000; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + i + "****");
}
}
}
}
class PrintNumber extends Thread {
@Override
public void run() {
for (int i = 0; i <= 10000; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}
}
2.线程的创建方式二:
2.1步骤:
- 创建一个实现Runnable接口的类
- 实现接口的run() —>将此线程要执行的操作,声明在此方法体中
- 创建当前实现类的对象
- 将此对象作为参数传递到Thread类的构造器中,创建Thread类的实例
- Thread类的实例调用start():①启动线程②调用当前线程的run()方法
2.2例题:创建一个分线程1,用于遍历100以内的偶数
public class EvenNumberTest2 {
public static void main(String[] args) {
EvenNumberPrint p = new EvenNumberPrint();
Thread t1 = new Thread(p);
t1.start();
Thread t2 = new Thread(p);
t2.start();
for (int i = 0; i <= 10000; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + i + "****");
}
}
}
}
class EvenNumberPrint implements Runnable {
@Override
public void run() {
for (int i = 0; i <= 10000; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}
}
3.对比两种方式?
- 共同点:①启动线程,使用的都是Thread类中定义的start()方法②创建的线程对象,都是Thread类或其子类的实例。
- 不同点:一个是类的继承,一个是接口的实现。建议使用实现Runnable接口的方式。好处:①实现的方式,避免类的单继承局限性②更适合处理有共享数据的问题③实现了代码和数据的分离
- 联系:
public class Thread implements Runnable
(代理模式)