1.继承Thread类,重写run方法;
2.实现Runnable接口,重写run方法;
3.实现Callable接口,重写call方法;
4.根据线程池来构建线程。
追其底层其实只有一种,都是实现Runnable接口,实现run方法。因为第一种Thread类本身就实现了Runnable接口;第三种实现Callable时需要搭配futureTask来使用,实现Callable时,需要将Callable的实现扔到futureTask中,把futureTask放到Thread的有参构造中,futureTask实现了RunnableFutrue,这个RunnableFutrue又继承了Runnable接口,执行的也是run方法;第四种基于线程池每次构造线程都是Worker类,Worker类又实现了Runnable接口,执行run方法,所以说追其底层其实就是一种方法。