创建线程的四种方式

目录

一 继承 Thread 类创建线程

二 实现 Runnable 接口创建线程

三 使用 Callable 和 Future 创建线程

四 使用线程池创建线程


一 继承 Thread 类创建线程

代码实现:

public class Main {
  public static void main(String[] args) throws InterruptedException {
       //创建并启动线程
    new TestThread().start(); //②③
  }

}

public class TestThread extends Thread{ //①
   //重写run方法
  public void run(){
      //业务逻辑
  }
}

原理说明:

通过继承 Thread 类来创建并启动多线程的一般步骤如下:

① 定义线程类,该类继承 Thread 类,重写该类的 run() 方法,该方法被称为线程执行体,里面执行业务逻辑。

② 线程类创建线程对象。

③ 执行 start() 方法启动线程。

需要说明的是,执行 start() 方法的时候,不会马上执行 run() 方法,只有在获取到 CPU 之后,才会执行 run() 方法。

二 实现 Runnable 接口创建线程

代码实现:

public class Main {
  public static void main(String[] args) throws InterruptedException {
    //创建并启动线程
    new Thread(new TestThread()).start();//②③
  }
}

public class TestThread implements Runnable {//①
   //重写run方法
  public void run(){
      //业务逻辑
  }
}

原理说明:

通过实现 Runnable 接口创建并启动线程一般步骤如下:

① 定义线程类,该类实现 Runnable 接口,重写 run() 方法。

② 线程类创建线程对象,该对象作为 Thread 构造函数参数来创建 Thread 对象,该Thread 对象才是真正的线程对象。

③ 执行 start() 方法启动线程。

需要说明的是,执行 start() 方法的时候,不会马上执行 run() 方法,只有在获取到 CPU 之后,才会执行 run() 方法。

三 使用 Callable 和 Future 创建线程

代码实现:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        FutureTask futureTask = new FutureTask<>(new CallableThread());②
        new Thread(futureTask).start();③
        System.out.println(futureTask.get());④
    }

public class CallableThread implements Callable {①
    @Override
    public Object call() throws Exception {
        System.out.println(Thread.currentThread().getName());
    }

}

原理说明:

使用 Callable 和 Future 创建并启动线程一般步骤如下:

① 定义线程类,该类实现 Callable 接口,重写 call() 方法。

② 使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了 Callable 对象的 call() 方法的返回值。

③ 使用 FutureTask 对象作为 Thread 对象的入参创建并启动线程(因为FutureTask实现了Runnable接口)。

④ 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。

需要说明的是 ,futureTask.get()会阻塞主线程,一直等子线程执行完并返回后才能继续执行主线程后面的代码。

四 使用线程池创建线程

使用线程池创建线程:https://blog.csdn.net/jack1liu/article/details/97046623

你可能感兴趣的:(Java学习笔记,Thread,Runnable,Callable,Future,线程池)