并发编程之多线程基础-Thread和Runnable的区别及联系(二)
上篇文章讲述了创建线程的常用方式
本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系
联系:
▶Thread类实现了Runable接口。
▶都需要重写里面Run方法。
区别:
▶Thread方式不支持多继承,Runnable方式支持多个实现
▶Runnable更容易实现资源共享,能多个线程同时处理一个资源。
疑惑分享:
本人在理解他们区别的时候
考虑到Thread类本身就是Runnable的实现类
所以产生了一个疑惑:-
为什么Runnable可以实现共享而Thread却不行呢
疑惑代码:
class Thread1 extends Thread {
int i = 100;
@Override
public void run() {
while (i > 0) {
try {
Thread.sleep(40L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (this) {
/*synchronized 不要直接放在run方法 应该放到循环里面 这样多个线程在循环的时候每次都能竞争锁 从而实现交替执行 否则一个线程执行完了另一个线程就没有执行的机会了*/
if (i > 0) {
/*
1.加判断是为了 如果当i=1的时候 此时两个线程都执行到了这里 一个线程得到锁进行减一操作那么i变为0 此时第二个线程再输出就会把0输出出来
2.第二个线程能够及时读取到i的值是由于synchronized既可以实现原子性又可以实现可见性*/
System.out.println(Thread.currentThread().getName() + "i:" + i);
i--;}}}
}}
public class TestThread {
public static void main(String[] args) {
Thread1 te1 = new Thread1();
Thread t1 = new Thread(te1, "window1");
Thread t2 = new Thread(te1, "window2");
t1.start();
t2.start();
}
}
下面我们就来聊一聊(有共同疑惑的朋友们可以参考一下):
首先我们要清楚Thread和Runnable两种方式的本质区别在哪里
我们知道无论使用哪种方式最终都会通过 Thread类对象调用start方法进行开启线程
本质的区别就在于:
Thread方式是调用无参构造方法
Runnable方式是调用带有Runnable参数的有参构造方法
我们说过Thread类实现了Runable接口
以上疑惑代码中就是向Thread构造方法中传递了一个Tel1参数
看似与Runnable没有关系
但实质上是属于常说的Runnable方式调用
对应源码:Thread(Runnable target, String name)
那么有参和无参有什么区别是什么呢,为什么runnable能实现资源共享:
参考源码:
this.target = paramRunnable;
public void run()
{
if (this.target != null)
this.target.run();
}
有参:
如果是参数中Runnable不为空
那么Thread run方法中最终执行的方法实际上是传进来Runnable中的run方法
所以使用Runnable方式 无论new出多少个Thread对象
最终执行的任务都是一样的
自然就实现了资源的共享
无参:
每次new出Thread对象
他们对应的成员变量是互不影响的
所以就不能达到资源共享的效果
涉及知识点:
JMM关于synchronized的两条规定:
1)线程解锁前,必须把共享变量的最新值刷新到主内存中
2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新获取最新的值
(注意:加锁与解锁需要是同一把锁)
通过以上两点,可以看到synchronized能够实现可见性。同时,由于synchronized具有同步锁,所以它也具有原子性
温馨提示:
▶在学习过程中理解一些概念或者结论不清晰的时候,一定要亲自动手结合着代码去分析,不要片面的理解一些知识点,一定要搞清实质。
▶本文内容如有不妥,恳请指正。
转载于:https://www.cnblogs.com/LoveShare/p/9782373.html
并发编程之多线程基础-Thread和Runnable的区别及联系(二)相关推荐
- 安琪拉教百里守约学并发编程之多线程基础
<安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 <安琪拉教鲁班学算法>系列文章 安琪拉教鲁班学算法 ...
- c+++11并发编程语言,C++11并发编程:多线程std:thread
原标题:C++11并发编程:多线程std:thread 一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植, ...
- 并发编程(一)多线程基础和原理
多线程基础 最近,准备回顾下多线程相关的知识体系,顺便在这里做个记录. 并发的发展历史 最早的计算机只能解决简单的数学运算问题,比如正弦. 余弦等.运行方式:程序员首先把程序写到纸上,然后穿 孔成卡片 ...
- C++11并发编程:多线程std::thread
一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改.现在在C++11中只需使用语 ...
- 并发编程之多线程基础-守护线程与非守护线程(四)
守护线程概念: 只要当前JVM实例中尚存在任何一个非守护线程没有结束, 守护线程就全部工作; 只有当最后一个非守护线程结 束时, 守护线程随着 JVM 一同结束工作. 守护线程最典型的应用就是 GC ...
- 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...
- java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术
我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...
- week6 day4 并发编程之多线程 理论
week6 day4 并发编程之多线程 理论 一.什么是线程 二.线程的创建开销小 三.线程和进程的区别 四.为何要用多线程 五.多线程的应用举例 六.经典的线程模型(了解) 七.POSIX线程(了解 ...
- 内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术
内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术_chuhan0449的博客-CSDN博客 我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听 ...
最新文章
- 4K 海思 联咏 芯片_画质的好坏并不只取决于屏幕 电视芯片也很重要
- java框架篇---hibernate(一对多)映射关系
- Hi3516A开发--i2c tools安装和使用
- 干货!全面认识Docker和基本指令
- Java反射原理学习之MethodHandle debug
- 写一个方法判断一个字符串是否对称_判断一个男生是否好色的方法
- SqlServer SqlBulkCopy批量插入 -- 多张表同时插入(事务)
- P2801-教主的魔法【分块,二分】
- linux cocos环境变量,Linux开发cocos2dx程序环境搭建
- 分治之快速排序以及快速排序为何最快
- linux中ftp保持连接,linux – FTP’ing大文件时如何防止TCP连接超时?
- html如何保存离线使用,如何完整保存离线网页
- 项目管理中的配置管理
- oracle怎么将数据删除文件,oracle删除数据文件
- 计算两点间距离C++
- linux autorun.sh,linux autorun使用详解
- [ Azure - Cloud Shell ] 微软 Azure Cloud Shell 介绍
- com.google.guava maven依赖
- 统计思维——通过统计方法解决分析问题
- Spring Cloud笔记 中级篇
热门文章
- Flash Media Live Encoder 使用帮助
- OpenCV 实现颜色直方图
- c# 火狐浏览器怎么嵌入窗体中_「C#上位机必看」你们想要的练手项目来了
- 5.5.35 - mysql 同步_MySQL 5.6.35主从同步配置案例
- C语言 main函数参数 argc,argv 用处,控制台应用程序模板2
- python3 tkinter 实现凯撒密码GUI界面
- 【codevs4228】小猫爬山(最优化剪枝)
- 【poj3263】Tallest Cow(差分数组)
- android 8.1闪退,宁波市民卡app在Android 8.1闪退_宁波民生e点通
- c语言编写程序统计某给定ascii文件中个字母的出现频率,2016年浙江理工大学理学院C语言程序设计考研复试题库...