目录标题
- 什么是静态代理模式
- 练习一
- 练习内容 婚庆公司代理你整理你结婚的大部分事情
- //静态代理讲解 //讲解婚庆结婚公司代理你整理结婚内务
- //总结: //真实对象和代理对象都要实现同一个接口 //而且代理对象要代理真实的对象 而不是自己本身 //好处:代理对象可以做很多真实对象做不了的事情 //真实对象专注做自己的事情
- //接口 //重点:接口中只需要创建方法的名字 //不用写方法体的内容 interface Marry{ void HappyMarry(); }
- //实现接口 //真实角色 自己去结婚 class You implements Marry{ @Override public void HappyMarry() { System.out.println("结婚了 很开心"); } }
- @Override public void HappyMarry() { before(); //this.target.HappyMarry(); 重点:这行代码的意思时 //this.target 为一个参数 意思为 : // 传进来的参数调用该参数类方法中实现接口HappyMarry方法中的内容 this.target.HappyMarry();//这个是真实结婚对象 after(); }
- lamda表达式
- 为什么用lamda以及理解
- 函数式接口的定义:任何接口 只包含唯一一个抽象方法 那么他就是一个函数式接口 对于函数式接口 我们可以通过lambda表达式来创建该接口的对象
- 练习一
- 推导lambda表达式 //复习前面知识的内容 //重点: //复习结果:静态内部类是放在类中方法体外的类 //而局部内部类和匿名内部类是放在类中方法体内的类
- //优化 由于Like类放在外部比较麻烦 可以放在类内 //所以利用静态内部类 //3 静态内部类(类名前面必须加static) static class Like2 implements ILike{ @Override public void lambda() { System.out.println("i like lambda2"); } }
- //接口去重新创建一个它的实现类对象 ILike like = new Like(); like.lambda();
- //1 定义一个函数式接口 interface ILike{ void lambda(); }
- //2 实现类 class Like implements ILike{ @Override public void lambda() { System.out.println("i like lambda"); } }
- 练习二
- 练习lambda表达式中 (当函数式接口带多个参数时)
- 练习三
- (重点:为什么学习lambda表达式 解释一:因为多线程 runnable接口中是函数式接口 可以利用lambda表达式来简化代码)
- 但函数式接口的方法中不止有一个参数时 lambda表达式 怎么去表达
- 重点:ILove love=null; 函数式接口定义一个对象去实现它的接口 但是 后面是null的是意思是没有类去实现(implement) 这个函数接口 直接定义为null 但是当有类(class)去实现函数式接口, 函数式接口定义一个对象去实现它的接口的代码为: 下图所示
- 但函数式接口的方法中不止有一个参数时 lambda表达式 怎么去表达
- 一 线程的状态
- 二 线程方法
- 三 停止线程
- 四 线程休眠
- 1000ms(毫秒)=1s(秒) 重点 每一个对象都有一把锁 sleep不会释放锁 而且sleep存在异常
- 练习一
- 当没有时间延迟时代码 可以看到电脑cpu运行太快 导致 黄牛党拿到全部的票数
- 练习二
- 添加网络延时后 可以看到 小明 小红 和黄牛党全部参与到了抢票的过程中
- 但是也发现了问题的所在性 出现了第0票
- //模拟网络延时 sleep //模拟网络延时的好处 :放大问题的发生性 // (比如该代码运行到最后发现 黄牛党拿到第0票 // 显然是错的的 因为没有第0票的票数)
- //添加模拟延时 //延时了100毫秒 也就是0.1秒 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
- 练习三
- 模拟倒计时 tenDOwn //下行代码 每隔一秒打印一个数字 tenDOwn();
- 练习三
- 打印当前的系统时间 利用线程里面的sleep方法
- //打印当前系统时间(因为时间秒 就是每隔一秒变换的) import java.text.SimpleDateFormat; import java.util.Date; //模拟推迟 public class TestSleep3 { public static void main(String[] args) { //打印当前系统时间 Date date = new Date(System.currentTimeMillis());//获取当前的系统时间 while (true){ try { Thread.sleep(1000); //输出当前的系统时间 System.out.println(new SimpleDateFormat("HH:mm:ss").format(date)); date=new Date(System.currentTimeMillis());//更新当前的系统时间 } catch (InterruptedException e) { e.printStackTrace(); } } } }
- 五 线程礼让
- 六 线程强制执行_join
- 七 线程状态观测
- 八 线程的优先级
- 九 守护线程
- daemon 线程
- //测试守护线程 //上帝守护你 练习 //重点: 虚拟机不用等待 守护线程执行完毕 //但是虚拟机必须要确保用户线程执行完毕 public class TestDaemon { public static void main(String[] args) { God god = new God(); You you = new You(); Thread thread = new Thread(god); //默认是false 则表示用户线程 正常的线程都是用户线程 thread.setDaemon(true); thread.start();//上帝守护线程启动 new Thread(you).start();//你 表示用户线程启动了 } }
什么是静态代理模式

重点 静态代理和线程的对比
下图红线部分两个方法在意义上相同!
重点!(婚庆公司来描述线程底部功能的实现原理)
HappyMarry()方法 是在一个接口中定义的一个方法体 里面没有方法内容
而You();类中实现了方法这个接口 创建了HappyMarry()方法里面的内容
可以用来理解多线程这个原理

练习一
练习内容 婚庆公司代理你整理你结婚的大部分事情
//静态代理讲解
//讲解婚庆结婚公司代理你整理结婚内务
//总结:
//真实对象和代理对象都要实现同一个接口
//而且代理对象要代理真实的对象 而不是自己本身
//好处:代理对象可以做很多真实对象做不了的事情
//真实对象专注做自己的事情
//接口
//重点:接口中只需要创建方法的名字
//不用写方法体的内容
interface Marry{
void HappyMarry();
}
//实现接口
//真实角色 自己去结婚
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println(“结婚了 很开心”);
}
}
@Override
public void HappyMarry() {
before();
//this.target.HappyMarry(); 重点:这行代码的意思时
//this.target 为一个参数 意思为 :
// 传进来的参数调用该参数类方法中实现接口HappyMarry方法中的内容
this.target.HappyMarry();//这个是真实结婚对象
after();
}


lamda表达式

为什么用lamda以及理解


函数式接口的定义:任何接口 只包含唯一一个抽象方法 那么他就是一个函数式接口
对于函数式接口 我们可以通过lambda表达式来创建该接口的对象
练习一
推导lambda表达式
//复习前面知识的内容
//重点:
//复习结果:静态内部类是放在类中方法体外的类
//而局部内部类和匿名内部类是放在类中方法体内的类
//优化 由于Like类放在外部比较麻烦 可以放在类内
//所以利用静态内部类
//3 静态内部类(类名前面必须加static)
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println(“i like lambda2”);
}
}
//接口去重新创建一个它的实现类对象
ILike like = new Like();
like.lambda();
//1 定义一个函数式接口
interface ILike{
void lambda();
}
//2 实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println(“i like lambda”);
}
}


练习二
练习lambda表达式中 (当函数式接口带多个参数时)

练习三
(重点:为什么学习lambda表达式
解释一:因为多线程 runnable接口中是函数式接口 可以利用lambda表达式来简化代码)
但函数式接口的方法中不止有一个参数时 lambda表达式
怎么去表达
重点:ILove love=null; 函数式接口定义一个对象去实现它的接口 但是 后面是null的是意思是没有类去实现(implement)
这个函数接口 直接定义为null
但是当有类(class)去实现函数式接口, 函数式接口定义一个对象去实现它的接口的代码为:
下图所示

但函数式接口的方法中不止有一个参数时 lambda表达式
怎么去表达

一 线程的状态

二 线程方法

三 停止线程

练习一
重点
//1 设置一个标志位
private boolean flag=true;
//2 设置一个公开的方法停止线程 转换标志位
public void stop(){
//注意这里是改变标志位的值为false
this.flag=false;
}
if (i==800){
//调用stop方法 切换标志位(改变值) 让线程停止
testStop.stop();
System.out.println(“线程该停止了”);
}

四 线程休眠
1000ms(毫秒)=1s(秒)
重点 每一个对象都有一把锁 sleep不会释放锁
而且sleep存在异常

练习一
当没有时间延迟时代码
可以看到电脑cpu运行太快 导致 黄牛党拿到全部的票数

练习二
添加网络延时后
可以看到 小明 小红 和黄牛党全部参与到了抢票的过程中
但是也发现了问题的所在性 出现了第0票
//模拟网络延时 sleep
//模拟网络延时的好处 :放大问题的发生性
// (比如该代码运行到最后发现 黄牛党拿到第0票
// 显然是错的的 因为没有第0票的票数)
//添加模拟延时
//延时了100毫秒 也就是0.1秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

练习三
模拟倒计时 tenDOwn
//下行代码 每隔一秒打印一个数字
tenDOwn();


练习三
打印当前的系统时间
利用线程里面的sleep方法
//打印当前系统时间(因为时间秒 就是每隔一秒变换的)
import java.text.SimpleDateFormat;
import java.util.Date;
//模拟推迟
public class TestSleep3 {
public static void main(String[] args) {
//打印当前系统时间
Date date = new Date(System.currentTimeMillis());//获取当前的系统时间
while (true){
try {
Thread.sleep(1000);
//输出当前的系统时间
System.out.println(new SimpleDateFormat(“HH:mm:ss”).format(date));
date=new Date(System.currentTimeMillis());//更新当前的系统时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

五 线程礼让
yield 礼让
礼让不一定成功 看cpu心情

线程一
// 测试礼让线程
// 礼让不一定成功 看cpu心情
Thread.yield();//线程礼让


六 线程强制执行_join

练习一
//测试线程join方法
//想象为插队
//主线程
for (int i = 0; i < 100; i++) {
if (i==10){
//插队开始
thread.join();
}
System.out.println(“main”+i);
}
这里可以看到 当插队开始的时候 一直是等到插队的thread线程全部运行完才让main线程执行的

七 线程状态观测

线程的状态
NEW新生状态 RUNNABLE运行状态
WAITING等待状态 TIME_WAITING退出状态

练习一
//先创建一个线程
//lambda表达式
Thread thread = new Thread(()->{
//线程运行过程中 设sleep方法 处于等待状态
for (int i = 0; i < 2; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(“…”);
});

八 线程的优先级
priority 优先级

class MyPriority implements Runnable{
@Override
public void run() {
//下行代码意思: 获取线程的名字还有优先级
System.out.println(Thread.currentThread().getName()+“—>”
+Thread.currentThread().getPriority());
}
}

九 守护线程
daemon 线程

//测试守护线程
//上帝守护你 练习
//重点: 虚拟机不用等待 守护线程执行完毕
//但是虚拟机必须要确保用户线程执行完毕
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
You you = new You();
Thread thread = new Thread(god);
//默认是false 则表示用户线程 正常的线程都是用户线程
thread.setDaemon(true);
thread.start();//上帝守护线程启动
new Thread(you).start();//你 表示用户线程启动了
}
}


被折叠的 条评论
为什么被折叠?



