创建线程的几种方式(一)

207 阅读2分钟

引言

最近在看汪文君大佬的"Java高并发编程实战"的视频,感觉受益匪浅.打算把学习过程中的一些知识点记录下来,以便日后复习.

因为大佬的视频分四个阶段,加起来好几百集,所以我会写一个系列文章(希望自己能坚持下来).Ok,let's get started:

P1主要讲解了课程大纲,P2讲解了线程的基本概念,这里不再复述. P3讲解了如何创建线程,这里就涉及到创建线程的几种方式.JDK的官方文档上明确说明有两种创建方式,一种是继承Thread类,一种是实现runnable接口.网上也有其他方式,比如使用lambda,实现callable接口,也有说使用ExcuterService创建线程池的方式来创建线程,其实后面几种本质上还是用的官方文档提到的那两种方式,但是因为在实际的开发过程中都会被频繁使用,所以在此我们一一说明.

创建线程的几种方式

继承Thread类重写run方法

public class CreateThread {
  class myThread extends Thread{
    @Override
    public void run() {
      System.out.println("Thread1 started");
    }
  }
  private void createThread1(){
    Thread thread = new myThread();
    thread.start();
  }
}

这种方式有一个变体就是,我们直接使用匿名来重写run方法,具体如下:

  private void createThread2(){
    Thread thread = new Thread(){
      @Override
      public void run() {
        System.out.println("Thread2 started");
      }
    };
    thread.start();
  }

如果实现类不会被重用的话,使用匿名类的方式更简洁一些. 当然,引入lambda表达式后,可以用更加简洁的方式,具体如下

private void createThread3(){
  Thread thread = new Thread(() => {System.out.println("Thread3 started");});
  thread.start();
}

总结

上面的三种写法归根到底还是使用的继承Thread类重写run方法这种方式,我们把他们归为一类.下一篇会讲到另一种创建方式:实现runnable接口的run方法.