https://cdn.nlark.com/yuque/0/2020/png/576791/1596812103502-a4b572a7-7205-4116-adac-2bd982d02ae7.png#height=540&id=oHxSi&originHeight=1080&originWidth=1920&originalType=binary&ratio=1&size=3019316&status=done&style=none&width=960

https://cdn.nlark.com/yuque/0/2020/png/576791/1596812160897-5ef8c9c5-6242-48cb-a7a6-282faae18455.png#height=540&id=mZKR2&originHeight=1080&originWidth=1920&originalType=binary&ratio=1&size=3028497&status=done&style=none&width=960

  1. 继承 Thread 类,重写 run 方法
  2. 实现 Runnable 接口,重写 run 方法(推荐)
  3. 实现 Callable 接口,重写 call 方法
  4. 线程池

https://cdn.nlark.com/yuque/0/2021/jpeg/576791/1615852891422-e69624ee-ba69-45aa-9b82-de82c506d97e.jpeg

1. 继承 Thread 类,重写 run 方法

Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。Thread 类的 start()方法最终会调用native方法,它将启动一个新线程,并执行run方法。示例如下:

class ExtendsThread extends Thread {
    // 重写run方法
    @Override
    public void run() {
        System.out.println("子线程" + Thread.currentThread().getName() + "正在执行 ");
    }
}

class Test {
    public static void main(String[] args) throws Exception {
        ExtendsThread t = new ExtendsThread();
        t.start();
    }
}

当然,我们也可以简单点,使用匿名类的方式创建

class Test {
    public static void main(String[] args) throws Exception {
        Thread t = new Thread(){
               public void run(){
                   System.out.println("Thread Running");
               }
             };
        t.start();
}

2. 实现 Runnable 接口

public class ImpRunnableThread implements Runnable {
    //重写run方法
    @Override
    public void run() {
        System.out.println("子线程" + Thread.currentThread().getName() + "正在执行 ");
    }
}

//测试
class Test {
    public void main(String[] args){
        ImpRunnableThread t = new ImpRunnableThread();
        Thread thread = new Thread(t);
        thread.start();
    }
}

同样,我们可以使用匿名类的方式创建


public class Test {
    public static void main(String[] args) throws Exception {
        Thread t = new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println("Runnable running");
            }
        });
        t.start();
    }
}

3. 使用 Callable 和 FutureTask 创建线程


public class ImpCallableThread implements Callable {
    //重写call方法
    @Override
    public String call() {
        System.out.println("子线程" + Thread.currentThread().getName() + "正在执行 ");
        return "返回值";
    }
}

//测试
class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask task = new FutureTask(new ImpCallableThread());
        new Thread(task).run();
        System.out.println("线程中获取到的返回信息  " + task.get() );
    }
}

4. 线程池

其实是比较推荐大家用线程池的方式去创建线程的,好处如下