JAVASE-API-11--线程 ---D20

复习:
1、 转换流:进行字符流和字节之间的转换
2、 打印流:能够向指定的位置输出数据。提供了格式化打印(printf)以及其他的一些便捷的打印(print)
3、 合并流:用于合并多个字节输入流。在合并的时候,需要将多个自己输入流放入一个Vector集合中,然后利用Vector来构建Enumeration对象,最后利用构建的Enumeration对象来构建一个合并流对象
4、 序列化/反序列化流
a) 序列化:将对象转化为字节数组的过程
b) 反序列化:将字节数组还原会对象的过程
c) 接口 – Serializable, 关键字 – static/transient, 版本号- serialVersionUID – 以防类在穿绳改动的时候已经序列化的对象无法反序列化回来
5、 Properties:可以持久化的映射。在存储的时候必须存储到.properties文件中。Properties文件默认使用的是西欧编码,所以不兼容中文。如果输入中文会自动转化为对应的编码。在实际使用过程中往往是作为配置文件使用
6、 RandomAccessFile:可以对文件进行读写操作,在使用的时候是将文件看做一个大型的字节数组,然后通过下标来操作对应位置 – 模式 ,下标
7、 Junit:单元测试。在使用的时候需要导入测试库 -@Test,@Before,@After
8、 JDK5的部分特性:
a) 静态导入:import static 包名.类名。静态方法名
b) 可变参数:用…来定义。可变参数本质上就是一个数组。可变参数在使用的时候可以传入任意个数的参数。但是一个方法中最多只能定义一个可变参数,而且必须放在参数列表的末尾。
c) 枚举:用enum来定义。枚举本质上是一个类。枚举中的构造方法默认私有,并且可以重载。枚举常量必须放在枚举类的首行。枚举类中可以定义方法和属性,包括抽象方法 – 顶级父类是Enum。从JDK1.5开始,switch-case 使用枚举常量



线程

进程:是计算机在执行的任务。
线程:进程中所分配的小的任务。 QQ、微信、下载软件

注意:计算机的每一个核在同一时刻内只能执行一个线程。在Windows系统中,默认只用一个核处理任务。在Linux系统中,有几个核就用几个核。

引入多线程的意义:线程在处理任务的时候大概可以分为两个大块- - -计算、交互- - 有数据需要处理的话,在CPU进行计算过程;数据可能还需要进行获取或者存储,意味着需要和其他硬件设备进行交互。当线程和硬件进行交互的时候,不去利用cpu计算的,也就意味着CPU处于空闲状态。
在这里插入图片描述
理论上当线程数量越多的时候,CPU的利用率就越高

定义线程:

  1. 继承Thread类,重写run方法,将要执行的逻辑或者任务放到run方法中。创建线程对象,然后调用start方法来开启线程
  2. 实现Runnable接口, 重写run方法。利用Runnable对象来构建一个Thread对象,最后利用Thread对象来开启线程 (重点)
  3. 实现Callable接口,重写call方法 – 现阶段只作为了解,到了高并发极端再详细讲解

Thread类:
在这里插入图片描述

Runnable:
在这里插入图片描述

多线程并发安全问题:

线程在执行的时候,是相互抢占执行的,而且这个抢占是发生在线程执行的每一步过程中。
由于线程的相互抢占导致出现了不合理的数据的现象称之为线程的并发安全问题
线程在哪抢走的,然后抢回来时候在那接着执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

同步代码块:

Synchronized代码块使用的时候需要一个锁对象- - -锁对象要求所有的线程都得认识 – 锁对象:共享资源、方法区中的资源、this
this作为锁对象的时候,要求用同一个对象来产生多个线程
扩展:类加载到方法区。方法区是被所有线程所共享
synchronized修饰的方法称之为同步方法。
如果修饰的非静态的方法,那么锁对象是this;如果修饰的静态方法,那么锁对象是当前类

同步:一个对象或者是一段逻辑在同一时间内只允许一个线程操作
异步:一个对象或者是一段逻辑在同一时间内允许多个线程操作。

同步一定安全吗?- - - - 一定安全的
安全一定同步吗?- - - - 不一定 - -ConcurrentHashMap

注意:从微观上,同步一定是安全的,安全也一定是同步的。但是如果从宏观上考虑,同步一定安全,但是安全不一定同步。

锁如果滥用,就会导致降低效率,产生死锁 - DeadLock和活锁(任务没有完成,占用CPU导致其他线程无法占用)问题。
死锁:锁的相互嵌套导致程序无法继续执行先去的想象

线程的等待唤醒机制:

通过wait-notify–notifyAll来实现线程之间的轮替执行

注意:等待唤醒在使用的时候必须结合锁来使用。使用对应的锁对象来让当前线程等待
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习:利用等待唤醒机制来实现生产消费模型
一个线程表示生产者,一个线程表示消费者。生产者生产一次,消费者消费一次- - Math.random()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:sleep和wait的异同点

sleep:在使用的时候需要指定休眠时间,到点自然醒。在无锁状态下释放执行权,在有锁状态下不释放执行权,sleep期间不释放锁。Sleep设计在Thread类上,是一个静态方法。
wait:在使用的时候可以指定等待时间也可以不指定,如果不指定等待时间就需要手动唤醒。wait期间,释放执行权,也释放锁。 wait设计在Object类上,是一个成员方法。


线程的状态:

在这里插入图片描述

线程的创建情形:

  1. 用户主动创建
  2. 系统自启
  3. 其他线程唤醒

线程的销毁方法:

  1. 自然死亡:线程执行完任务
  2. 他杀:被其他线程结束
  3. 意外死亡:线程中抛出了异常

守护线程

只要被守护的线程结束,守护线程就随之结束。
一个线程要么是守护线程,要么是被守护的线程。只有当所有的被守护线程结束,才会导致所有的守护线程结束。
GC是一个守护线程。
在这里插入图片描述

线程的优先级

线程的优先级是1-10。理论上,数字越大优先级越高,就意味着抢占到资源的概率就越大。实际使用过程中,相邻的两个优先级的差别非常不明显。至少相差5个优先级,差别才相对明显一点点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值