luogg_java学习_12_线程
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.
转载请注明 出自 : luogg的博客园 谢谢配合!
线程
程序、进程、线程的概念
- 程序:我们用程序设计语言编写的静态代码
- 进程:进程是程序的一次执行,是动态的概念,每个程序载入内存中运行就产生一个进程,进程独占系统资源,所谓的多进程指的是可以有多个程序同时执行
- 线程:线程是比进程更小的执行单位,一个程序中运行的多个任务,多个线程共享所在进程的资源(一个进程可以包含一个或多个线程,一个进程至少要包含一个线程,例如:主线程 main)。
例如:
我们每个人就是一个多线程的对象,想想看,我们可以边吃饭边看电视,同时还要呼吸、心跳等,在同一时间内可以做几件事情,
线程的两种创建方式
- 继承Thread类
- 创建类继承 Thread 类
- 复写 run 方法(想要同时执行代码)
- 激活线程类或启动线程类 start()
- 实现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_线程的更多相关文章
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- ORB-SLAM2 论文&代码学习 —— LocalMapping 线程
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 Local ...
- 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理
摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...
- 学习C#线程
2016-12-17 无意间看到了关于C#线程的讲解.经过一下午的学习后,慢慢的对线程也有了一定的理解.这里讲解的是最基础的内容,包括线程的创建.睡眠.等待.终止. 实验环境:Visual studi ...
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- java SE学习之线程同步(详细介绍)
java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题: 当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个 ...
- 从使用到原理学习Java线程池
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...
- JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?
前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...
随机推荐
- 企业IT管理员IE11升级指南【4】—— IE企业模式介绍
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- MySQL 存储过程和函数
概述 一提到存储过程可能就会引出另一个话题就是存储过程的优缺点,这里也不做讨论,一般别人问我我就这样回答你觉得它好你就用它.因为mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数 ...
- MySQL MMM高可用方案
200 ? "200px" : this.width)!important;} --> 介绍 本篇文章主要介绍搭建MMM方案以及MMM架构的原理.这里不介绍主从.主主的搭建方 ...
- 开始研究web,mark一下
之前想要搞引擎,经过思考之后,定位为webgl方面的引擎,这个决定早就做了,只是没有写下来 做了一些调研之后,确定使用babylon.js 和typescript 和c# 来开发 Babylo ...
- 《Spark快速大数据分析》—— 第五章 数据读取和保存
由于Spark是在Hadoop家族之上发展出来的,因此底层为了兼容hadoop,支持了多种的数据格式.如S3.HDFS.Cassandra.HBase,有了这些数据的组织形式,数据的来源和存储都可以多 ...
- LINQ系列:Linq to Object聚合操作符
聚合函数在一系列的值上执行特定的运算,并返回单个值,如在给定元素的值上执行求和或计数运算. LINQ共有7种聚合操作符:Aggregate.Average.Count.LongCount.Max.Mi ...
- .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
我们知道资源被注册到R.java我们通过R.java就可以读取到界面中的组件.跟我们.net一样,通过ID来读取组件 知识点: 通过R.java读取组件 MainActivity.java通过find ...
- multipart数据结构
--[boundary]\r\n [headers]\r\n \r\n [content]\r\n --[boundary]\r\n [headers]\r\n \r\n [content]\r\n ...
- ZooKeeper集群搭建中的Connection refused而导致的启动失败
1. 前言 每一次搭建集群环境都像一次战斗,作战中任何一个细节的出错都会导致严重的后果,所以搭建中所需要做的配置如系统配置.网络配置(防火墙记得关).用户权限.文件权限还有配置文件等等内容,都必须非常 ...
- [c++] constexpr and literal class
稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++? 2. int i; // not constant const ...