线程Thread:
任务:做的事情 多任务:同时做很多事情
多线程:计算机同时做很多事情
并发控制:对同一份资源的操作 资源抢夺问题
主线程:只有一条执行路径 效率低
多线程:多条执行路径 主线程和子线程并行交替执行 效率高
CPU调度和执行的单位
独立执行的路径
线程分为守护线程和用户线程
进程Process:
程序执行的过程
计算机中运行的程序就是进程 例如 QQ 游戏
进程中可以有多个线程 例如 声音 图片 弹幕 至少有一个线程
线程实现的三种方式:
第一种实现方式:
继承Thread类:
重写run方法,执行这个线程
main方法:主线程
调用start()方法开启新线程 ,与主线程同时运行
Thread类: 本身实现Runnable接口
线程开启不一定立即执行由CPU调度
第二种实现方式(推荐使用):
实现Runnable接口:
重写run方法,执行这个线程
创建线程对象 调用start()方法启动线程
将Runnable接口的实现类对象丢入线程对象(代理)
静态代理
第三种实现方式(不常用):
实现Callable接口:
重写call方法 需要返回值
创建执行服务 创建线程池
提交执行 传入Callable的实现类对象
获取结果
关闭服务
好处可以定义返回值 抛出异常
线程的五个状态:
创建状态 启动线程进入 就绪状态 获得CPU资源进入 运行状态
线程自然执行完毕或者外部干涉终止线程进入 死亡状态
一旦死亡不能启动
当运行状态等待用户输入或者休眠时进入 阻塞状态
阻塞解除回到就绪状态
运行状态释放CPU资源回到就绪状态
线程推荐自然结束或者设置标志位编写停止代码改变标志
睡眠sleep用于网络延时倒计时
每个对象都由一个锁,sleep不会释放锁
线程礼让:yield 线程回到就绪状态 重新抢夺CPU
线程强制执行:join 其他线程阻塞
线程优先级1-10 主线程默认是5
Deamon默认是false表示是用户线程 true表示是守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕
线程同步synchronized:
多个线程操作同一个资源:并发
排队:队列
锁:当一个线程获得对象的排它锁 独占资源 其他线程必须等待
控制对象或方法访问的关键字synchronizad
synchronizad(obj){代码块}
CopyOnwriteArrayList线程安全的数组
线程通信:
生产者消费者问题
线程不安全(并发问题):
多个线程同时操作一个资源
死锁:
一个同步代码块同时拥有两个以上对象的锁
都在等待对方释放资源 都停止执行
Lock锁 JVM花费更少时间调度线程 性能更好:
JDK5.0开始 的 显示同步锁手动开关
synchronized隐式自动
ReentrantLock可重用锁类实现了Lock
静态代理:
通过传入目标(真实)对象进代理对象 帮助完成一些事情
真实对象和目标对象实现同一个接口
代理对象代理真实角色
代理对象创建时传入真实对象 执行方法时调用真实对象的方法
代理对象可以完成真实对象不能完成的事情
真实对象专注于自己的方法
Lambda表达式:
避免内部类定义过多
函数式编程
(参数)->{语句}
匿名内部类:只用一次的
函数式接口:一个接口里面只有一个抽象方法
(Lambda表达式的前提)
通过Lambda表达式创建函数式接口对象
外部类->静态内部类->局部内部类->匿名内部类(没有类名)
->JDK1.8 lambda
参数->语句
线程池~