上篇文章讲述了创建线程的常用方式

本篇主要分析一下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的区别及联系(二)相关推荐

  1. 安琪拉教百里守约学并发编程之多线程基础

    <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 <安琪拉教鲁班学算法>系列文章 安琪拉教鲁班学算法 ...

  2. c+++11并发编程语言,C++11并发编程:多线程std:thread

    原标题:C++11并发编程:多线程std:thread 一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植, ...

  3. 并发编程(一)多线程基础和原理

    多线程基础 最近,准备回顾下多线程相关的知识体系,顺便在这里做个记录. 并发的发展历史 最早的计算机只能解决简单的数学运算问题,比如正弦. 余弦等.运行方式:程序员首先把程序写到纸上,然后穿 孔成卡片 ...

  4. C++11并发编程:多线程std::thread

    一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改.现在在C++11中只需使用语 ...

  5. 并发编程之多线程基础-守护线程与非守护线程(四)

    守护线程概念: 只要当前JVM实例中尚存在任何一个非守护线程没有结束, 守护线程就全部工作; 只有当最后一个非守护线程结 束时, 守护线程随着 JVM 一同结束工作. 守护线程最典型的应用就是 GC ...

  6. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  7. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

  8. week6 day4 并发编程之多线程 理论

    week6 day4 并发编程之多线程 理论 一.什么是线程 二.线程的创建开销小 三.线程和进程的区别 四.为何要用多线程 五.多线程的应用举例 六.经典的线程模型(了解) 七.POSIX线程(了解 ...

  9. 内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术_chuhan0449的博客-CSDN博客 我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听 ...

最新文章

  1. 4K 海思 联咏 芯片_画质的好坏并不只取决于屏幕 电视芯片也很重要
  2. java框架篇---hibernate(一对多)映射关系
  3. Hi3516A开发--i2c tools安装和使用
  4. 干货!全面认识Docker和基本指令
  5. Java反射原理学习之MethodHandle debug
  6. 写一个方法判断一个字符串是否对称_判断一个男生是否好色的方法
  7. SqlServer SqlBulkCopy批量插入 -- 多张表同时插入(事务)
  8. P2801-教主的魔法【分块,二分】
  9. linux cocos环境变量,Linux开发cocos2dx程序环境搭建
  10. 分治之快速排序以及快速排序为何最快
  11. linux中ftp保持连接,linux – FTP’ing大文件时如何防止TCP连接超时?
  12. html如何保存离线使用,如何完整保存离线网页
  13. 项目管理中的配置管理
  14. oracle怎么将数据删除文件,oracle删除数据文件
  15. 计算两点间距离C++
  16. linux autorun.sh,linux autorun使用详解
  17. [ Azure - Cloud Shell ] 微软 Azure Cloud Shell 介绍
  18. com.google.guava maven依赖
  19. 统计思维——通过统计方法解决分析问题
  20. Spring Cloud笔记 中级篇

热门文章

  1. Flash Media Live Encoder 使用帮助
  2. OpenCV 实现颜色直方图
  3. c# 火狐浏览器怎么嵌入窗体中_「C#上位机必看」你们想要的练手项目来了
  4. 5.5.35 - mysql 同步_MySQL 5.6.35主从同步配置案例
  5. C语言 main函数参数 argc,argv 用处,控制台应用程序模板2
  6. python3 tkinter 实现凯撒密码GUI界面
  7. 【codevs4228】小猫爬山(最优化剪枝)
  8. 【poj3263】Tallest Cow(差分数组)
  9. android 8.1闪退,宁波市民卡app在Android 8.1闪退_宁波民生e点通
  10. c语言编写程序统计某给定ascii文件中个字母的出现频率,2016年浙江理工大学理学院C语言程序设计考研复试题库...