1.继承Thread类

1. 继承Thead类并重写该类的run()方法,该run方法的方法体就代表了线程需要完成的任务
2. 创建子类的实例对象
3. 调用线程对象的start()方法来启动该线程
public class Thread1 extends Thread {
    @Override
    public void run() {
        for (int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"在Thread1里面执行"+i);
        }
    }
}
public class ThreadTest {
    public static void main(String[] args){

        for (int i=0;i<10;i++){
            new Thread1().start();
            System.out.println(Thread.currentThread().getName()+" 在main方法中执行 "+i);
        }
    }
}

2. 实现Runnable接口

1.定义Runnable接口的实现类,并重写run方法,该run方法的方法体同样是该线程的线程执行体
2. 创建Runnable实现类的实力对象,并以这个实例对象作为Thread的target来创建Thread类;
3. 调用线程对象的start方法来启动该线程
public class Thread1 implements Runnable {

    public void run() {
        for (int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"在Thread1里面执行"+i);
        }
    }
}
public class ThreadTest {
    public static void main(String[] args){

        for (int i=0;i<10;i++){
            new Thread(new Thread1()).start();
            System.out.println(Thread.currentThread().getName()+" 在main方法中执行 "+i);
        }
    }
}

main函数中名没有直接执行Thread1的run方法,而是将Thread1填入到了Thread中,使用start方法来启动。Runable实现类里包含run方法,仅仅作为线程执行体,而实际的线程对象依然是Thread实例对象,Thread为真正创建线程的对象。

3. 匿名内部类

本质上也是一个类实现了Runnable接口,重写了run方法,只不过这个类没有名字,直接作为参数传入Thread类
public class ThreadTest {
    public static void main(String[] args){
        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 50; i++) {
                    System.out.println(Thread.currentThread().getName() + "执行" + i);
                }
            }
        }).start();
        

        for(int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"执行"+i);
        }


    }
}