最近观察同事面试,发现他对问题的理解本身就有不对,这样即使面试者完全掌握了那个问题,也可能给不了他想要的回答。
他的问题是:Java 里有哪些创建线程的方式?他期望的答案是 Thread, Runnable, Callable, Future 这些。
这个理解是错误的,他也是网上看的。
一、线程与任务
线程可以理解为 可以执行程序指令的机器,而任务则是要执行的一段指令。
在 Java 里用 java.lang.Thread
类来表示线程。用 java.lang.Runnable
接口表示任务。
任务创建出来后是需要放到线程上去执行的,所谓线程驱动任务执行。
创建、启动线程
创建线程一般是创建一个 Thread
类的实例,可以在创建时指定任务,也可以覆写 void run()
方法来实现任务的逻辑。
Thread
类实例化后只是在 Java 堆里创建了一个线程对象,并没有跟操作系统的线程关联起来,还不能真正执行任务。需要调用 native void start()
方法(这个方法在不同的 JDK 版本里有所不同)。所以如果是继承了 Thread
类,是不能覆写 start
方法的,否则是没法启动线程的。
start
方法调用后,线程会自动执行 run
方法, run
方法执行完成后线程就会销毁。
二、Callable, Future
java.util.concurrent.Callable
表示一个带返回值的任务,是一种特殊点任务。
java.util.concurrent.Future
表示一个可在未来获得调用结果的存根。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。