本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.

转载请注明 出自 : luogg的博客园 谢谢配合!

线程

程序、进程、线程的概念

  • 程序:我们用程序设计语言编写的静态代码
  • 进程:进程是程序的一次执行,是动态的概念,每个程序载入内存中运行就产生一个进程,进程独占系统资源,所谓的多进程指的是可以有多个程序同时执行
  • 线程:线程是比进程更小的执行单位,一个程序中运行的多个任务,多个线程共享所在进程的资源(一个进程可以包含一个或多个线程,一个进程至少要包含一个线程,例如:主线程 main)。

例如:
我们每个人就是一个多线程的对象,想想看,我们可以边吃饭边看电视,同时还要呼吸、心跳等,在同一时间内可以做几件事情,

线程的两种创建方式

  1. 继承Thread类

    • 创建类继承 Thread 类
    • 复写 run 方法(想要同时执行代码)
    • 激活线程类或启动线程类 start()
  2. 实现Runnable接口
    • 创建类实现 Runnable 接口
    • 复写 run 方法(想要同时执行代码)
    • 激活线程类或启动线程类 start()

线程的两种创建方式对比

继承: 继承的同时默认的也实现了Runnable接口
实现的方式优于继承的方式 , 1, 避免了单继承的局限性 2, 如果多个线程要操作同一份数据(或资源), 更适合用实现的方式

线程的常用方法

start();新建的线程进入runnable状态
sleep();
run();
getName();获取线程名称
setName();
currentThread()调取当前线程
join(); 在a线程中调用B线程的join方法
isAlive
getPriority() 获取线程优先级 默认5 1,10
setPriority

Object中的方法

wait 等待
notify 通知,用于线程通信
notifyAll 通知所有线程

使用多线程优点

1, 提高应用程序的响应
2, 提高计算机cpu的利用率
3, 改善程序结构

线程的生命周期

1,新建 new
2,就绪 start
3,运行
4,阻塞
5,死亡

线程的安全问题

由于一个线程在操作共享数据过程中, 未执行完的情况下, 另外的线程参数进来, 导致了共享数据存在了安全问题

如何解决线程的安全问题

必须让一个线程操作共享数据完了之后,其他线程才有机会参与线程数据共享

java实现线程的安全

1,同步代码块

慎用tihs原因: 继承时候有多个对象,不知道this指哪个
同步监视器可以写this(当前对象), 也可以写static Object obj = new Object();中的obj

2,同步方法


类本身充当锁: 类名.class

同步方法的锁是tihs(默认了),当继承线程时,会创建多个对象, 用同步方法也会出错

同步和死锁

案例:“银行取款问题”,银行账户,可以办卡,可以办存折, 假设,现在两人同时通过存折或者是卡取钱,卡里有500,甲拿卡取500,乙拿着存折也要取500

同步:某一个对象占用CPU资源的时候,其他对象不能抢占CPU的资源,必须等当前对象使用完该资源的时候才能使用CPU资源
异步:就是线程的默认状态,所有对象都可以随时抢占CPU的资源。

实现同步的方式:
1、把需要同步的代码用 synchronized(对象) {} 语句块绑定
2、把需要同步的代码放到方法中,并且用 synchronized 关键字声明,然后再在 run 方法中调用

死锁
过多的同步就有可能导致死锁

线程不同的弊端:

由于一个时间只能有一个线程访问共享数据, 效率变低了

懒汉式单例模式处理线程安全问题

线程的死锁

线程通信

luogg_java学习_12_线程的更多相关文章

  1. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  2. ORB-SLAM2 论文&代码学习 —— LocalMapping 线程

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 Local ...

  3. 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

    摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...

  4. 学习C#线程

    2016-12-17 无意间看到了关于C#线程的讲解.经过一下午的学习后,慢慢的对线程也有了一定的理解.这里讲解的是最基础的内容,包括线程的创建.睡眠.等待.终止. 实验环境:Visual studi ...

  5. java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  6. java SE学习之线程同步(详细介绍)

           java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题:               当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个 ...

  7. 从使用到原理学习Java线程池

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...

  8. Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)

    Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...

  9. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

随机推荐

  1. 慎重管理SQL Server服务的登录(启动)账户和密码

    今天是大年初三,先跟大家拜个年,祝大家新年快乐.今天处理了一个alwaysOn问题——辅助副本因为磁盘空间不足一直显示[未同步——可疑],在日志中可以看到数据库处于挂起状态,与主副本失去同步.原以为只 ...

  2. Azure SQL Database (19) Stretch Database 概览

    <Windows Azure Platform 系列文章目录>  Azure SQL Database (19) Stretch Database 概览      Azure SQL Da ...

  3. Thrift架构~目录

    回到占占推荐博客索引 概念相关 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ru ...

  4. WebDriver--操控浏览器

    前一篇讲述了元素的定位方法,现在开始练习如何写自动化测试脚本 我使用的编辑工具是PyCharm,今后该博客中所写的有关Python脚本,都是在该工具中编写的. WebDriver提供了控制浏览器大小. ...

  5. fir.im Weekly - 如何进行 Android App 性能优化

    关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...

  6. 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  7. Android音频开发之AudioTrack实时播放

    前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音.然后实时播放也只能采用Aud ...

  8. LTP随笔——本地调用ltp之ltp4j

    关于ltp本地调用的相关参考请见LTP的Git项目:https://github.com/HIT-SCIR 以下以/home/lion/Desktop路径为例下面教程中出现的具体路径以你实际配置的为准 ...

  9. ORM框架示例及查询测试,上首页修改版(11种框架)

    继上次ORM之殇,我们需要什么样的ORM框架? 整理了11个ORM框架测试示例,通过示例代码和结果,能很容易了解各种框架的特性,优缺点,排名不分先后 EF PDF XCODE CRL NHiberna ...

  10. 设计窘境:来自 Repository 的一丝线索,Domain Model 再重新设计

    写在前面 阅读目录: 疑惑解读 设计窘境 一幅图的灵感 为嘛还是你-Repository 后记 上一篇<No zuo no die:DDD 应对具体业务场景,Domain Model 重新设计& ...