Java 复习之多线程
线程的概念
一个进程可包含一个或多个线程
多进程的内部数据和状态是独立的
多线程是共享一块内存空间和一组系统资源有可能互相影响
线程切换比进程的负担小
程序启动就自动产生一个线程即主线程 main 方法就执行在主线程
*线程的生命周期
一个线程从创建到消亡的过程 : 1 创建状态 new 2 : 可运行状态 start 3:不可运行状态 sleep wait IO阻塞 4:消亡状态 5 : 阻塞状态
(下图不包含锁的情况)
run()
start() 开始线程
线程消亡 只能靠 run 方法自然结束 ,stop() 不安全,可在 run 加判断结束代码执行
终止线程运行的情况:
1 yield() 让出了 CPU 的占用权
2 sleep
3 IO
4 出现一个优先级更高的线程
5 支持时间片的系统中,线程的时间片用完
*线程的实现
1 继承 Thread 类 重写 run 方法 2 实现 Runnable 接口 然后实现 run 方法
代码写在 run 方法中 线程启动 start 方法
线程的优先级
通过 setPriority() 来更改线程的优先级
线程的优先级 是 1~ 10 之间的正整数, 默认为 5
*多线程的同步
多线程可能存在两个或多个线程尝试去访问一个资源造成同步问题,例如: 去银行取钱 账户余额 1000元 同时在柜台 和 取款机各提取 800 , 柜台 和 取款机我们看做两个取款线程,访问一分资源 1000。此时其中一个线程已经把 800 取出来了 ,数据还未同步另外一个线程访问账户余额的数据还是 1000 。这种情况显然是不合理的 ,所以我们需要有办法去解决多线程同步的问题。
synchronized
为了解决多线程访问共享资源造成的同步问题,可以用 synchronized 来解决。原理是只要使用了 synchronized 获取到 CPU 执行权的线程开始访问资源,并且对资源(方法或者代码块)所在的对象上锁(lock),当一个对象被上锁后。试图访问这个对象资源的线程就必须在外阻塞等待已经获取锁的线程的 run 方法执行完毕或者中途抛出异常等情况让出 CPU 的执行权以及对象解锁。
synchronized 的使用方式分为两种
1 synchronized 修饰方法
2 synchronized 代码块
synchronized(object){
}
synchronized 代码块为更细粒度的解决同步问题,如果在一个方法中。不可能产生同步问题的代码我们不需要上锁,能更有效的节约资源
需要注意的是: static 修饰的 synchronized 方法上锁的是所在对象的 class 对象 而不是所在对象的锁
线程间如何通信? wait notify notifyAll
两个或多个线程同时 start 后 run 方法中分别做 for 循环遍历 ,遍历中对一个共享 int 变量 0,一个线程做 int ++ 一个线程做 int -- ; 问如何保证每次输出的结果是 1010101.... 或者 01010101...
1 首先保证执行 ++ 或者 -- 的方法 或者 代码逻辑做了 synchronized 处理。解决同步问题
2 在某个线程获得 CPU 的执行权后,进入 synchronized ,如果遇到 int 变量不是预期的结果就调用对象的 wait 方法。让去 CPU 的执行权 让其他线程抢占,如果是预期的结果则执行 ++ 或者 -- 。本身的 ++ -- 逻辑做完以后当前线程工作完毕 调用对象的 notify 或者 notifyAll 通知其他线程去抢占 CPU 的执行权,以及类推在互相唤醒和等待的过程中实现 101010。 解决线程间通信问题
延伸: deadlock 死锁 哲学家就餐问题
Java 复习之多线程相关推荐
- java复习二十一天[多线程终]
CopyOnWriteArrayList CopyOnWriteArrayList位于java.util.concurrent并发包下是线程安全的集合,该类可以实现安全的增删改查如: import j ...
- Java多线程复习_Java多线程复习
一.线程的基本概念 简单的说:线程就是一个程序里不同的执行路径 在同一个时间点上cpu只会有一个线程在执行 Java里的多线程是通过java.lang.Thread类来实现的 每个线程都拥有自己独立的 ...
- 别人的Morgan Stanley面试,注重基础,java core、多线程、设计模式、设计程序。。。
过完年来就打算换工作,而是复习了1个月的基础做过的项目和英语.这个月的某天突然接到猎头的推荐,摩根斯坦利的direct hire职位,心中激动不已,抓紧复习英语,搜索了下ms的面试情况,全程都是英语面 ...
- 中国海洋大学-信息系统开发(Java)复习
Java复习 OUC_Shizue 1 Java编译器和执行器 Java编译器和执行器是Java语言的两个核心组件,分别用于将Java源代码编译成Java字节码文件和运行Java字节码文件. Java ...
- Java复习面试知识点
Java复习面试知识点 前言: 简要的记录一下学习到的东西,仅供自己查阅和复习方便.希望该文章能对你有帮助,文章学习自博客和b站UP主的教程 集合: 集合简介: Java标准库自带的java.util ...
- JAVA复习系列(一)
** JAVA复习系列(一) 文章目录 JAVA复习系列(一) 1.1 Java入门(基础概念与常识) 1.1.1Java语言的特点 1.1.2 JVM,JDK,JRE的关系 1.1.2.1 JVM( ...
- JAVA并发之多线程基础(2)
除了我们经常用的synchronized关键字(结合Object的wait()和notify()使用)之外,还有对应的上篇文章讲到的方法JAVA并发之多线程基础(1)之外,我们日常中使用到最多的也就是 ...
- Java基础、多线程、JVM、集合八股文自述(持续更新)
Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...
- Java中的多线程编程(超详细总结)
文章目录 Java中的多线程编程(超详细总结) 一.线程与多线程的概念 二.线程与进程之间的关系 三.一个线程的生命周期 四.多线程的目的和意义 五.线程的实现的方式 Java中的多线程编程(超详细总 ...
最新文章
- div 下 的img水平居中
- 来来来,个人blog第一弹——WordPress的Linux运行环境
- 使用Clonezilla克隆系统
- tomcat端口号被占用
- 专业网络推广浅析蜘蛛对网站有抓取但没收录的现象
- 想学python-为什么现在那么多人想学Python?
- caffe 加入 cudnn编译
- 个人工作13年的一些人生真实领悟
- docker kali安装mysql_Linux环境使用Docker安装MySql
- 最常用的Linux命令大全
- 数学建模第六章 微分方程建模
- wamp环境单独安装(windows下apache2.4、mysql5.5、php5.5的版本)
- ie浏览器跳不出下一个页面怎么回事_用户现在可以在微软Edge Chromium中启动IE模式访问传统老旧网站...
- Python中for循环之range、enumerate函数
- 全新UI多用户任务悬赏系统源码+带三级分销推广
- 【九天教您南方cass 9.1】 10 DTM土方计算的四种方法
- iphone上安装android系统,如何在iPhone上安装Android操作系统
- 态势感知“裸奔”的中国人 | 专访 360 张翀斌
- 21经济网专访 | 巨杉下一个十年:扎根科创福地,打造数据库行业生态
- Spring中如何操作JDBC
热门文章
- 效率值计算机公式,工作效率提升怎么计算(学会十个Excel公式)
- 钢材表面缺陷检测分类不同图像增强方式的对比研究
- HTML——Header:请求头参数详解
- 几分钟黑掉阿里,被马云500万年薪收编的黑客,现在混得咋样了?
- python可视化库matplotlib_环境搭建 | Python 数据可视化库 Matplotlib 快速入门之一-阿里云开发者社区...
- 2016年12月当前世界经济形势分析--美国的加息计谋
- 【leetcode】小行星碰撞
- 最新苹果服务器认证,Sign in with Apple-苹果登录(客户端和服务端)
- 公民身份证校验规则最新最全最严格(包含最后一位校验码校验)
- 求助FC上的一个c++代码实现丧心病狂的走迷宫小游戏!