多线程
接口
##继承Thread类
子类继承Thread类具备多线程能力启动线程:子类对象. start()
不建议使用:避免OOP单继承局限性
##实现Runnable接口
实现接口Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
##静态代理模式总结:
真实对象和代理对象都要实现同一个接口
代理对象要代理真实角色
##好处:
代理对象可以做很多真实对象做不了的事情
真实对象专注做自己的事情
Lambda表达式
##Lambda表达式
格式:()->
函数式接口的定义:
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
例如:public interface Runnable {
public abstract void run();
}
对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。
总结:
lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹。
前提是接口为函数式接口
线程状态
- 创建——就绪====运行——阻塞——死亡
线程礼让
## 礼让线程,让当前正在执行的线程暂停,但不阻塞
将线程从运行状态转为就绪状态
让cpu重新调度,礼让不一定成功!看CPU心情
代码:Thread.yield();
Join(插队)
##Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞(可以理解为插队)
代码:thread.join();
守护(daemon)线程
## 线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕
如,后台记录操作日志,监控内存,垃圾回收等待..
代码: thread.setDaemon(true);//默认是false表示用户线程,正常为用户线程
线程同步机制(同步方法和同步块)
##锁机制
#同步方法:synchronized
#同步块:synchronized(Obj){}
两者可以保护代码的安全性
Lock锁
class A{
private final ReentrantLock lock=new ReentrantLock();
public void m(){
try {
//加锁
lock.lock();
//保证线程安全的代码;
}
}finally {
lock.unlock();//如果同步代码有异常,要将其写入
}
}
}
线程通信
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCxtzMDv-1672884394117)(C:\Users\15364\Desktop\Java笔记Typora\image\线程通信.png)]
线程池
##JDK 5.0起提供了线程池相关API: ExecutorService和Executors
##ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor
#void execute(Runnable command)∶执行任务/命令,没有返回值,一般用来执行Runnable
#<T>Future<T>submit(Callable<T> task):执行任务,有返回值,一般又来执行Callable
#void shutdown():关闭连接池
##Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池