11.5(day21) 进程 线程 多线程 线程安全问题 单例模式 死锁 线程生命周期
进程:
正在进行中的程序
线程:
可独立运行的代码的片段
所属于进程
多线程:
一个进程中有多个可独立运行的代码片段
一个进程中至少有一个进程
如果有一个线程的程序,称之为单线程程序
java语言支持多线程
所有的程序执行都在内存中开辟空间,依赖CPU执行,我们看的是CPU同时执行这些应用程序,其实CPU某一时刻只能执行一个程序,CPU坐着高速的切换动作
创建线程:
1.继承java.lang.Thread类
1.定义类继承Thread类
2.重写run方法(run即是子线程所要运行的代码)
3.在主线程中创建子线程,并启动子线程
弊端:
由于java是单继承,如果类已经继承了其他类,不能再去继承线程类
即是当前类没有继承其他类,是否继承线程,也是要考虑继承体系结构,不能去改变结构
2.实现java.lang.Runnable接口
1.定义类实现Runnable接口
2.在类中实现run方法
3.创建线程对象,thread对象
4.将实现类对象,作为参考传递给thread对象的构造方法
5.调用start方法启动线程
获取当前线程对象:
Thread.currentThread() 该方法写到哪里获取的就是所在的线程的对象
获取线程名称:
getName()
设置线程名:
setName(name)
线程优先级:
1-10
默认级别:5
getPriority():获取优先级
setPriority(number):设置优先级
线程安全问题:
原因:
多个线程操作同一个资源时,对该资源操作的代码不止一行时,一个线程没有执行完关于该资源的执行代码,另一个线程参与进来执行
解决办法:
一个线程执行时,另一个线程不能参与执行
同步代码块:
synchronized(锁对象){
}
对象可以为任意对象
前提:
1.大于等于两个以上的线程
2.保证多线程使用的是同一个锁对象
好处:
解决了多线程安全问题
弊端:
效率降低了
单例模式:
保证对象的唯一性
1.将构造方法私有化
2.创建本类的对象
3.创建方法,返回本类对象
两种写法:
饿汉式:多线程访问时没有安全问题
懒汉式:多线程访问时有安全问题,不能保证对象的唯一,需要加入同步解决问题
死锁:
实际开发中不能出现死锁
程序卡在某一个地方,不能继续向下执行,这种现象--死锁
锁对象:
synchronized可以用来修饰方法,修饰的方法具备了同步的特性
1.实例同步方法:this
2.静态同步方法:类名.class
线程生命周期:
新建状态:new Thread(),new Thread(new Runnable(){})
可运行状态:调用start(),有执行资格,等到CPU调度
正在运行状态:CPU调度该线程
终止状态:run方法结束
堵塞状态:正在运行进入到该状态,主动放弃执行资格,CPU不在调度
startc sleep(时间):让线程睡一会,时间到了自然醒---可运行状态
wait():让线程等待 notify():唤醒处于等待状态的线程---可运行状态
join():加入线程
当多线程中某一个线程发生了异常,这个线程停止运行并返回异常信息,其他线程继续运行不会停止,即对其他线程没有影响