并发编程是Java语言的重要特性之一,“如何在Java中实现线程”是学习并发编程的入门知识,也是Java工程师面试必备的基础知识。本文从线程说起,然后用代码说明如何在Java中实现线程。

一、什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,也可以使用多线程对运算密集型任务提速。如果使用得当,线程可以有效地降低程序的开发和运维成本,同时能够提升程序的性能。

二、线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程。每个进程都有自己的内存空间,可执行代码和唯一进程标识符(PID)。

每条线程并行执行不同的任务。不同的进程使用不同的内存空间(线程自己的堆栈),而所有的线程共享一片相同的内存空间(进程主内存)。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

三、如何在Java中实现线程?

“如何在Java中实现线程”是学习并发编程入门的必备知识,对于这个问题也是众说纷纭?打开百度搜索一下,一看便知。在信息爆炸的时代,我认为像孙悟空一样有一双火眼金睛是很必要的,分辨出哪些观点更加准确,才能少走弯路。

那究竟有几种方法可以实现线程?哪一家的言论更权威,被更多的开发者所认同呢?毋庸置疑,当然是官网文档了。文档地址

如图中所示:

There are two ways to create a new thread of execution.

One is to declare a class to be a subclass of Thread. ...

The other way to create a thread is to declare a class that implements the Runnable interface. ...

现在可以肯定地说,在Java中实现线程有两种方式, 分别是继承 Thread 类和实现 Runnable 接口。下面分别用两种方式实现线程。

方法一:继承Thread类。

public class MyThread extends Thread {

public static void main(String[] args) {

new MyThread().start();

}

@Override

public void run() {

System.out.println("用Thread类实现线程");

}

}

方法二:实现Runnable接口。

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 类哪种方式更好?

Runnable和Thread两者最大的区别是Thread是类而Runnable是接口,至于用类还是用接口,取决于继承上的实际需要。Java类是单继承的,实现多个接口可以实现类似多继承的操作。

使用继承 Thread 的方式的话,那么每次想新建一个任务,只能新建一个独立的线程,而这样做的损耗会比较大。而如果采用实现Runnable接口的话,Runnable就相当于一个作业,而Thread才是真正的处理线程,我们需要的只是定义这个作业,然后将作业交给线程去处理,这样就达到了松耦合,也符合面向对象里面组合的使用。

五、总结

当下次再遇到这样的面试题的时候,可以这样硬刚面试官:

Java官方文档说明有两种方式实现线程:继承Thread和实现Runnable接口。

但是深入源码会发现,其实是一种本质方式,只能通过新建Thread类来创建线程,但是类里面的run方法有两种方式来实现,第一种是重写run方法,第二种实现Runnable接口的run方法,然后再把该runnable实例传给Thread类。

如何在java中实现线程_用代码说话:如何在Java中实现线程相关推荐

  1. Java怎么在if输出中进行运算_磕代码:c/c++/java:输入三个整数,输出运算结果;if条件句的使...

    磕代码:c/c++/java:输入三个整数,输出运算结果:if条件句的使 磕代码:c/c++/java:输入三个整数,输出运算结果:if条件句的使用 c: #include int main() { ...

  2. rn在java中什么意思_[React Native Android 安利系列]RN中使用js调用java代码

    欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有: 书接上节,我们上节说道,如何控制原生andr ...

  3. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  4. java 对象序列化 数组_序列化-将任何对象转换为j中的字节数组

    您要执行的操作称为"序列化". 有几种方法可以做到,但是如果您不需要花哨的东西,我认为使用标准Java对象序列化就可以了. 也许您可以使用这样的东西? package com.ex ...

  5. 为什么java中floatda正确_为什么cast to float在java中产生正确的结果?

    文档没有特别好地解释,但 Double.toString(double)基本上在它产生的输出中执行一些舍入. Double.toString算法在整个Java SE中使用,包括例如System.out ...

  6. java 变量名 字符串_如何使字符串值在java中调用特定的现有JButton变量名?

    所以,我知道有这样的: int number = Integer.parseInt("5"); String numtxt = Integer.toString(12); doub ...

  7. 中科方德java开发编码规范_插件推荐:如何将Java编码规范落地实际开发中

    一个软件需要花费80%的生命周期成本去维护. 几乎没有任何软件的整个生命周期仅由其原作者来维护. 编码规范改善软件的可读性,让工程师更快更彻底地理解新的代码. 如果你将源代码转变为一个产品,那么您需要 ...

  8. Java游戏守卫者_我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通...

    原标题:我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通 事情起因:有小伙伴投稿,说自己被同学拉入了一个<我的世界>群聊,自己原准备大侃特侃,但发现他们聊的东西跟自己玩的 ...

  9. java grpc 服务路由_.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容

    原标题:.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容 英文:devblogs.microsoft.com 来源:艾心 译文:cnblogs.com/ediso ...

最新文章

  1. C/C++程序基础 (八)数据结构
  2. 框架下cookie的使用_为什么自动化运维系统越来越多使用都RESTful API?
  3. java中文本框显示在命令按钮后面_Maya中Pymel写个带界面的重命名工具(一)
  4. 路由虚拟端口配置dhcp服务器,交换机和路由器DHCP设置中的端口配置
  5. Java查询图书信息
  6. Python中的无序集合(set)
  7. python中none什么意思_如何理解Python中的None
  8. 精心梳理二十二道常见SSM面试题(带答案)
  9. 数据可视化分析工具评测: DataEase (开源新贵)VS.帆软 FineBI(老牌产品)
  10. Mac终端find命令的使用
  11. 入门物联网需要服务器
  12. python监测网页变化_Python利用Last-Modified实现监控网页变化
  13. unifex:C++现代异步模型先导
  14. 沟谷网络提取及沟壑密度计算
  15. Jmeter - 从入门到精通高级篇 - jmeter使用监视器结果监控tomcat性能(详解教程)
  16. Python中的排列和组合
  17. 平面解析几何----双曲线的硬解公式
  18. macbookpro 序列号查询 香港苹果官网
  19. div+css静态网页设计web网页设计实例作业 ——中国风的茶文化(4页) web课程设计-HTML网页制作代码
  20. 安装指定版本Kubernetes

热门文章

  1. 通过Bigtop编译Hadoop组件的rpm包
  2. 查看当前内存使用情况---练习记录
  3. P10全彩屏C语言编程,STC90C52RC驱动P10LED屏的程序
  4. java接收前台tex格式t数据_java 下载文件时,设置response.setContentType 根据文件类型...
  5. Fedora 10下应用网络模拟器NS心得
  6. ListView实现多种item布局的方法和注意事项
  7. APPCAN学习笔记003---原生开发与HTML5技术
  8. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
  9. asp.net mvc 前台使用后台变量
  10. mysql命令行的几个用法