并发编程是Java语言的重要特性之一,“如何在Java中实现线程”是学习并发编程的入门知识,也是Java工程师面试必备的基础知识。本文从线程提及,而后用代码说明如何在Java中实现线程。html
线程是操做系统可以进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运做单位。程序员能够经过它进行多处理器编程,也可使用多线程对运算密集型任务提速。若是使用得当,线程能够有效地下降程序的开发和运维成本,同时可以提高程序的性能。java
线程是进程的子集,一个进程能够有不少线程。每一个进程都有本身的内存空间,可执行代码和惟一进程标识符(PID)。程序员
每条线程并行执行不一样的任务。不一样的进程使用不一样的内存空间(线程本身的堆栈),而全部的线程共享一片相同的内存空间(进程主内存)。别把它和栈内存搞混,每一个线程都拥有单独的栈内存用来存储本地数据。面试
“如何在Java中实现线程”是学习并发编程入门的必备知识,对于这个问题也是众说纷纭?打开百度搜索一下,一看便知。在信息爆炸的时代,我认为像孙悟空同样有一双火眼金睛是很必要的,分辨出哪些观点更加准确,才能少走弯路。编程
那究竟有几种方法能够实现线程?哪一家的言论更权威,被更多的开发者所认同呢?毋庸置疑,固然是官网文档了。文档地址api
如图中所示:多线程
There are two ways to create a new thread of execution.并发
One is to declare a class to be a subclass of Thread. ...oracle
The other way to create a thread is to declare a class that implements the Runnable interface. ...运维
如今能够确定地说,在Java中实现线程有两种方式, 分别是继承 Thread 类和实现 Runnable 接口。下面分别用两种方式实现线程。
public class MyThread extends Thread { public static void main(String[] args) { new MyThread().start(); } @Override public void run() { System.out.println("用Thread类实现线程"); } }
public class MyRunnable implements Runnable { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } @Override public void run() { System.out.println("用Runnable接口实现线程"); } }
深刻去看Thread类的源码,能够看到Thread类实现了Runnable接口。
而且Thread类重写了run方法, run 方法的代码以下:
看过源码能够发现,其实两种方法实现线程的本质是同样的,都是最终调用了 start()方法来新建线程。这两个方法的最主要区别在于 run()方法的内容来源:
继承Thread类: run()方法总体被重写;
实现Runnable接口:最终调用 target.run()。
Runnable和Thread二者最大的区别是Thread是类而Runnable是接口,至于用类仍是用接口,取决于继承上的实际须要。Java类是单继承的,实现多个接口能够实现相似多继承的操做。
使用继承 Thread 的方式的话,那么每次想新建一个任务,只能新建一个独立的线程,而这样作的损耗会比较大。而若是采用实现Runnable接口的话,Runnable就至关于一个做业,而Thread才是真正的处理线程,咱们须要的只是定义这个做业,而后将做业交给线程去处理,这样就达到了松耦合,也符合面向对象里面组合的使用。
当下次再遇到这样的面试题的时候,能够这样硬刚面试官:
Java官方文档说明有两种方式实现线程:继承Thread和实现Runnable接口。
可是深刻源码会发现,实际上是一种本质方式,只能经过新建Thread类来建立线程,可是类里面的run方法有两种方式来实现,第一种是重写run方法,第二种实现Runnable接口的run方法,而后再把该runnable实例传给Thread类。
原文出处:https://www.cnblogs.com/sgh1023/p/11426858.html