Java中有几种创建线程的方式?
刚开始看到这个“八股”的时候,很多答案都至少有四种以上:继承Thread类、实现Runnable接口、实现Callable接口、使用ExecutorService线程池、CompletetableFuture类等等,虽然创建线程的方式在API层面上有以上几种,但底层都最终是通过Thread对象与操作系统的线程进行绑定(通过JVM的native方法最终调用到操作系统的线程创建函数),直接调用run()方法并不会创建新线程,只有调用start()方法才会触发新线程的创建。

- 类加载的时候将Java方法与本地JVM函数绑定
- 当调用Thread.start()时,Java层调用start0()方法,找到与之绑定的JVM层函数,这个函数调用create_thread()函数,创建原生的操作系统线程
- 创建出一条内核线程后,映射Java线程与OS线程
- 最后执行载入的线程体,也就是编写的run()方法
Runnable、Callab不是创建线程的方式,它们是创建线程体的方式,线程体是一个可运行的任务。
Callable实际上就是Runnable的封装体。