<aside> 💡 《阿里巴巴 Java 开发手册》中好像提到不要显式创建线程,而是使用线程池。

Untitled

</aside>

方式一:继承 Thread

  1. 定义一个子类 MyThread 继承线程类 java.lang.Thread,重写 run() 方法
  2. 创建 MyThread 类的对象
  3. 调用线程对象的 start() 方法启动线程(启动后还是执行run方法的)
package com.itheima.d1_create;

/**
   目标:多线程的创建方式一:继承Thread类实现。
 */
public class ThreadDemo1 {
    public static void main(String[] args) {
        // 3、new一个新线程对象
        Thread t = new MyThread();
        // 4、调用start方法启动线程(执行的还是run方法)
        t.start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程执行输出:" + i);
        }

    }
}

/**
   1、定义一个线程类继承Thread类
 */
class MyThread extends Thread{
    /**
       2、重写run方法,里面是定义线程以后要干啥
     */
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程执行输出:" + i);
        }
    }
}

优缺点:

优点:编码简单 缺点:线程类已经继承 Thread,无法继承其他类,不利于扩展。

<aside> ⚠️ 注意事项:

方式二:实现 Runnable 接口

  1. 定义一个线程任务类 MyRunnable 实现 Runnable 接口,重写 run() 方法。
  2. 创建 MyRunnable 任务对象
  3. MyRunnable 任务对象交给 Thread 处理
  4. 调用线程对象的 start() 方法启动线程
/**
   目标:学会线程的创建方式二,理解它的优缺点。
 */
public class ThreadDemo2 {
    public static void main(String[] args) {
        // 3、创建一个任务对象
        Runnable target = new MyRunnable();
        // 4、把任务对象交给Thread处理
        Thread t = new Thread(target);
        // Thread t = new Thread(target, "1号");
        // 5、启动线程
        t.start();

        for (int i = 0; i < 10; i++) {
            System.out.println("主线程执行输出:" + i);
        }
    }
}

/**
   1、定义一个线程任务类 实现Runnable接口
 */
class MyRunnable  implements Runnable {
    /**
       2、重写run方法,定义线程的执行任务的
     */
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程执行输出:" + i);
        }
    }
}

优缺点

优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强。 缺点:编程多一层对象包装,如果线程有执行结果是不可以直接返回的。

匿名内部类实现

public class ThreadDemo2 {
    public static void main(String[] args) {
        // 使用匿名内部类创建线程
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("子线程执行输出:" + i);
                }
            }
        });

        // 启动线程
        t.start();

        for (int i = 0; i < 10; i++) {
            System.out.println("主线程执行输出:" + i);
        }
    }
}

<aside> 💡 改写为 Lambda 的形式:

package com.itheima.d1_create;

public class ThreadDemo1 {
    public static void main(String[] args) {
        // 使用Lambda表达式创建线程
        Thread t = new Thread(() -> {
            // 定义线程要执行的任务
            for (int i = 0; i < 5; i++) {
                System.out.println("子线程执行输出:" + i);
            }
        });

        // 启动线程
        t.start();

        // 主线程执行的任务
        for (int i = 0; i < 5; i++) {
            System.out.println("主线程执行输出:" + i);
        }
    }
}

</aside>