如何在java中实现线程_用代码说话:如何在Java中实现线程
并发编程是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中实现线程相关推荐
- Java怎么在if输出中进行运算_磕代码:c/c++/java:输入三个整数,输出运算结果;if条件句的使...
磕代码:c/c++/java:输入三个整数,输出运算结果:if条件句的使 磕代码:c/c++/java:输入三个整数,输出运算结果:if条件句的使用 c: #include int main() { ...
- rn在java中什么意思_[React Native Android 安利系列]RN中使用js调用java代码
欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有: 书接上节,我们上节说道,如何控制原生andr ...
- java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本
举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...
- java 对象序列化 数组_序列化-将任何对象转换为j中的字节数组
您要执行的操作称为"序列化". 有几种方法可以做到,但是如果您不需要花哨的东西,我认为使用标准Java对象序列化就可以了. 也许您可以使用这样的东西? package com.ex ...
- 为什么java中floatda正确_为什么cast to float在java中产生正确的结果?
文档没有特别好地解释,但 Double.toString(double)基本上在它产生的输出中执行一些舍入. Double.toString算法在整个Java SE中使用,包括例如System.out ...
- java 变量名 字符串_如何使字符串值在java中调用特定的现有JButton变量名?
所以,我知道有这样的: int number = Integer.parseInt("5"); String numtxt = Integer.toString(12); doub ...
- 中科方德java开发编码规范_插件推荐:如何将Java编码规范落地实际开发中
一个软件需要花费80%的生命周期成本去维护. 几乎没有任何软件的整个生命周期仅由其原作者来维护. 编码规范改善软件的可读性,让工程师更快更彻底地理解新的代码. 如果你将源代码转变为一个产品,那么您需要 ...
- Java游戏守卫者_我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通...
原标题:我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通 事情起因:有小伙伴投稿,说自己被同学拉入了一个<我的世界>群聊,自己原准备大侃特侃,但发现他们聊的东西跟自己玩的 ...
- 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 ...
最新文章
- C/C++程序基础 (八)数据结构
- 框架下cookie的使用_为什么自动化运维系统越来越多使用都RESTful API?
- java中文本框显示在命令按钮后面_Maya中Pymel写个带界面的重命名工具(一)
- 路由虚拟端口配置dhcp服务器,交换机和路由器DHCP设置中的端口配置
- Java查询图书信息
- Python中的无序集合(set)
- python中none什么意思_如何理解Python中的None
- 精心梳理二十二道常见SSM面试题(带答案)
- 数据可视化分析工具评测: DataEase (开源新贵)VS.帆软 FineBI(老牌产品)
- Mac终端find命令的使用
- 入门物联网需要服务器
- python监测网页变化_Python利用Last-Modified实现监控网页变化
- unifex:C++现代异步模型先导
- 沟谷网络提取及沟壑密度计算
- Jmeter - 从入门到精通高级篇 - jmeter使用监视器结果监控tomcat性能(详解教程)
- Python中的排列和组合
- 平面解析几何----双曲线的硬解公式
- macbookpro 序列号查询 香港苹果官网
- div+css静态网页设计web网页设计实例作业 ——中国风的茶文化(4页) web课程设计-HTML网页制作代码
- 安装指定版本Kubernetes
热门文章
- 通过Bigtop编译Hadoop组件的rpm包
- 查看当前内存使用情况---练习记录
- P10全彩屏C语言编程,STC90C52RC驱动P10LED屏的程序
- java接收前台tex格式t数据_java 下载文件时,设置response.setContentType 根据文件类型...
- Fedora 10下应用网络模拟器NS心得
- ListView实现多种item布局的方法和注意事项
- APPCAN学习笔记003---原生开发与HTML5技术
- [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
- asp.net mvc 前台使用后台变量
- mysql命令行的几个用法