创建线程有几种方式?
面试遇到这个问题,有点懵,只知道创建线程,调用start() 方法。回来经过搜索,看到答案中的多种方法最后都是回到了 new Thread() 中,不同的方法只是使用线程来执行代码的用法不同而已。
那么,记录一下网络上所说的使用线程执行代码的几种方式。
- 继承 Thread 类,重载 run 方法
- 实现 Runnable 接口,作为参数传递给 Thread 的构造方法
- 实现 Callable 接口,作为参数传递给 FutureTask,然后将 FutureTask 作为参数,构建 Thread。
- 使用线程池
第一种,继承 Thread, 重载 run 方法,这是最基本的。
第二种,实现 Runnable 接口,作为参数构建 Thread,作为成员变量存储在 target 变量中,Thread 实现了 Runnable 接口,默认 run 实现就是 target 不为空的情况下,调用其 run 方法,在第一种方式上加了一层。
第三种,实现 Callable,查看 Thread 方法,除了线程信息,就是 Runnable,查看 FutureTask 实现了 Runnable,对应的 Callable 也是在 run 方法中调用,在第二种方法中又加了一层。
第四种,查看线程池Executors.newFixedThreadPool():ExecutorService
的实现,其中的线程是通过 ThreadFactory
默认为 DefaultThreadFactory
,也是通过new Thread()
实现。
所以当被问到线程的创建方式时,应该是要问你启动线程执行任务的方式,而这些启动线程的方式,也是通过 Thread 中的 run 方法完成,几种不同方式实际上只是开发中的几种常见方式。