网上有说3或者4种,他们说的4种或者3种是把什么线程池也放进去了,今天我们就来看下oracle官网的描述,
A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.
Every thread has a priority. Threads with higher priority are executed in preference to threads with lower priority. Each thread may or may not also be marked as a daemon. When code running in some thread creates a new Thread
object, the new thread has its priority initially set equal to the priority of the creating thread, and is a daemon thread if and only if the creating thread is a daemon.
When a Java Virtual Machine starts up, there is usually a single non-daemon thread (which typically calls the method named main
of some designated class). The Java Virtual Machine continues to execute threads until either of the following occurs:
- The
exit
method of classRuntime
has been called and the security manager has permitted the exit operation to take place. - All threads that are not daemon threads have died, either by returning from the call to the
run
method or by throwing an exception that propagates beyond therun
method.
There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread
. This subclass should override the run
method of class Thread
. An instance of the subclass can then be allocated and started. For example, a thread that computes primes larger than a stated value could be written as follows:
这是oracle官网对Thread类的描述:https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Thread.html
我看到的是jdk14 但是不会影响对我们今天面试题的答案
在上面英文描述最后的一段话中我们可以找到答案:
There are two ways to create a new thread of execution
就是创建线程有二种方式,一个是继承Thread,还有一种是实现Runnable接口,这是官网说明的,够有权威的吧
至于说什么3或者4种,比如说Callable或者线程池只是基于线程做了一些封装操作而已,底层实现还是线程,它的本质没有变,
二种创建线程方式的对比
肯定是推荐使用实现Runnable方式创建线程的,理由支持如下:
1:如果是继承Thread,因为Java只支持单继承,这就限制了继承其他类,也就限制了它的扩展
2:我们在平时开发中很少说单独去开启一个线程,大部分都是使用线程池去管理线程,那么线程池需要的是Runnable,
3:如果使用继承Thread类开启线程的话,每次都是去开启一个线程,这样内存消耗比较大,如果是使用Runnable结合线程池可以降低消耗