多线程
实现Callable接口
主要步骤和区别就在上面了
它有返回值 而且可以跑出异常
本章核心
Lambda表达式
只有函数式接口才能使用lamdba表达式
接口实现使用的简化
1.定义一个函数式接口
interface ILike{
voide lambda();
}
2.实现类
class Like implments ILike{
public void lambda(){
System.out.printl("fuck");
}
}
3.使用
普通使用
静态内部类使用
局部内部类使用
匿名内部类
lambda表达式
总结
线程停止
自己去写一个方法,满足某些情况时,执行自己的方法让线程停止
线程休眠
线程礼让
礼让不一定成功 因为礼让是让线程重新变成就绪状态 而不是阻塞状态
线程插队
线程状态
线程优先级
优先级高的不一定先执行,但是先执行的概率很大
守护线程
gc就是守护线程
1.创建2个线程 其中一个上帝是守护线程
2.将上帝变成守护线程
jvm是不会管守护线程是否结束的
线程同步
使用锁或者队列
这个synchronized锁,它锁的是this 也就是说锁的是方法本身 如果方法本身没有操作到需要同步的数据时,锁是没用的,例如所有小偷都进入房间了,然后你才把他们锁起来一样,所以也可以使用同步代码块。
我们只要把需要操作的数据放入代码块中,然后将共享资源(共享的会改变的实例对象)成为监视器就好了
JUC拓展
java.util.concurrent包下的CopyOnWriteArrayList是一个线程安全的数组列表
死锁
下面模拟2个线程争抢锁
为choice为0的线程 进来先获取口红,而choice为1(不为0)的 进来先获取镜子
当线程阻塞时间过后 0的获取镜子 1的获取口红,因为口红和镜子只有一份所以发生死锁
Lock锁
ReentrantLock (可重复锁)
在使用共享资源的地方使用lock.lock()方法就能加锁,但是别忘记死锁了
synchronized和Lock区别
线程协作 线程通信
生产者消费者问题
解决方法1
缓冲区
生产者
消费者
方法2flag标志位
===================================================
\