当前位置:网站首页>3.多线程两种实现方式的区别
3.多线程两种实现方式的区别
2022-08-08 06:23:00 【永远的攀登者】
3.多线程两种实现方式的区别
1.面试题:Thread类和Runnable接口实现多线程的区别?(多线程两种实现的区别?)
1).Thread类是Runnable接口的子类,使用Runnable接口可以避免单继承局限。
2).Runnable接口实现多线程可以比Thread类实现多线程,更加清楚的描述数据共享的概念。
1.1 Thread是Runnable的子类,使用Runnable可以避免单继承局限
查看Thread类源码如下:
public class Thread extends Object implements Runnable
Thread类,实现了Runnable接口,整体定义机构看起来像代理设计模式;
代理模式:客户端调用的start方法应该是Runnable接口提供的方法才对。
1.2 Runnable比Thread实现多线程更加清楚的描述数据共享的概念
Thread实现的多线程如下:
public class MyThread extends Thread{
private int money=10;
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (money > 0) {
System.out.print("购物,mony = " + this.money-- + ";");
}
}
}
}
class TestThread{
public static void main(String[] args) {
MyThread m1= new MyThread();
MyThread m2= new MyThread();
MyThread m3= new MyThread();
m1.start();
m2.start();
m3.start();
}
}
看看多线程这部分有问题吗?看下启动多线程的代码的内存分布情况如下

这样写的结果肯定是不是共享这个10元,而是每进程10元,应该修改为如下调用方式:
class TestThread{
public static void main(String[] args) {
MyThread m1= new MyThread();
new Thread(m1).start();
new Thread(m1).start();
new Thread(m1).start();
}
}
修改后的代码看着总是怪怪的,MyThread类直接就可以调用start方法,却不用,创建父类对象调用start方法,有点舍近求远的意思。
Runnable实现多线程代码如下
public class MyRunnable implements Runnable{
private int mony=10;
@Override
public void run() {
for(int i=0;i<100;i++){
if(mony>0) {
System.out.print("购物,mony = " + this.mony--+";");
}
}
}
}
class TestRunnable{
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
new Thread(myRunnable).start();
new Thread(myRunnable).start();
new Thread(myRunnable).start();
}
}
这段代码的内存分布图如下:

从代码上Runnable接口实现多线程,可以更加清楚的描述数据共享的概念。
边栏推荐
- 使用pyQt 网格布局(QGridLayout)创建一个计算器
- 课堂作业--黑客语解密
- es6模块+异步promise+async/await
- JS截取字符串最后一个字符,截取“,”逗号前面字符,赋值集合
- mycmsms靶机wp
- MIND TensorFlow serving 部署预测用户embedding
- Consumer Goods Industry Report: Coconut Oil Market Status Research Analysis and Development Prospect Forecast
- 消费品行业报告:椰子油市场现状研究分析与发展前景预测
- word写论文中的一些方法
- Neo4j服务配置
猜你喜欢
随机推荐
模板引擎art-template
2022秋春招/提前批面经分享总结(字节、腾讯、阿里)
逻辑回归 判断学生能否被大学录取
screen 命令修改默认快捷键ctrl + a
Nvidia Jetson Xavier安装中文输入法(googlepinyin)
Anaconda installation and use
微信记账小程序(附源码),你值得拥有!
摔倒检测综述
this指向问题
课堂作业--物不知数
有哪些可以“躺平”的技术开发岗位?------音视频开发畅谈
YoloV4训练自己的数据集(一)
方便面行业调研:预计2028年将达到436亿美元
节流与防抖
减脂书籍~~~
爬取实习吧前四页的招聘信息
二. Redis 数据类型
基于knn的手写数字识别
消费品行业报告:化妆品容器市场现状研究分析与发展前景预测
四. Redis 事务、锁机制秒杀








