目录
4.静态代理模式
例子,婚庆公司:
代码:
结果:
静态代理模式小结:
真实对象和代理对象都要实现同一个接口;代理对象要代理真实角色。
好处:代理对象可以做很多真实对象不能做或者不方便做的事情;真实对象专注于自己的事情。
(比如我可以把布置婚礼,付尾款给到You这个真实对象,但是这样从程序设计的角度来看,这两个功能和You这个类的内聚性不强,关系不是很大,而且如果写一个You这一年的事情,那么这两个功能仅仅在婚礼上用一次,显然是不太好的,尤其是当我们开启多线程的时候,每个You的对象都这样做,那显然是比较难看的设计模式)
PS:Thread也是实现了runnable接口,代理了runnable,下面两个本质是一样的
5.Lambda(λ)表达式
(1)理论
(2)代码实例(顺便复个习):
/*推导一个lamda表达式*/
public class Lamdada {
//3.静态内部类
static class Like2 implements ILike {
@Override
public void lambda() {
System.out.println("2");
}
}
public static void main(String[] args) {
//方法一:一个接口,一个实现类,再调用,显然略显麻烦
ILike like = new Like();
like.lambda();
//方法二:静态内部类
like = new Like2();
like.lambda();
//4.局部内部类
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println("3");
}
}
//方法三:局部内部类
like=new Like3();
like.lambda();
//5.匿名内部类,没有类的名称,必须借助接口和父类
like=new ILike() {
@Override
public void lambda() {
System.out.println("4");
}
};
//方法四:匿名内部类
like.lambda();
//方法五:用lambda简化
like=()->{
System.out.println("5");
};
like.lambda();
}
}
//1.定义一个函数式接口
interface ILike {
void lambda();
}
//2.实现类
class Like implements ILike {
@Override
public void lambda() {
System.out.println("1");
}
}
接口只有一个类
这2篇文章可以看一下:Java Lambda 表达式 | 菜鸟教程
Java语法—— Lambda表达式_何翰宇的博客-CSDN博客_java lambda表达式
(3)进一步的简化:
而在多线程中,由于runnable接口只有一个run抽象方法,也可以是函数式的,可以用Lambda简化。
6.线程状态
(1)五大状态:
(2)线程停止
实例:
(3)线程休眠
实例1:
那么我们知道多个对象同时操作一个资源不安全,那可能一下子发现不了(尤其调度是cpu来做的),那我们可以通过模拟网络延时来放大问题的发生性,从而发现问题,再解决问题:
比如这里的结果就有点不对了:
实例2:
模拟10秒倒计时
(4)线程礼让
比如有a,b两个线程准备进入,cpu让a先进入,然后代码让a礼让,那么还是回到a,b两个线程准备进入的状态,cpu再调度可能是a进入,也可能是b进入。
实例
//测试礼让线程
//礼让不一定成功,看cpu心情
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread( myYield,"a").start();
new Thread( myYield,"b").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 线程开始");
Thread.yield();
System.out.println(Thread.currentThread().getName()+" 线程停止");
}
}
这是礼让成功的结果:
(5)线程强转执行
实例
(6)线程状态观察
实例:
结果:
wait(阻塞)是因我们写了5秒的延迟,不然计算机太快了,都打印不出来
/就是这个线程的所有任务,之后就停止
7.线程优先级
这里t5,t6会报错,因为只有1-10
去掉t5,t6的结果:
thread3是t4,它优先级最高
但是,这不绝对,并不一定每次都是优先级高的先跑(性能倒置),不过一般是这样的
8.守护线程
main就是用户线程,gc(垃圾)是守护线程
这样就能创建守护线程,和之前正常的用户线程就多了一个这个setDarmon