今日学习总结
今天因为早上有课所以有些摆烂,但是上课大部分时间在看狂神最后的2P——自定义异常小结和JAVASE总结。
中午下课吃完饭背完英语一点钟,玩会手机两点钟睡觉,没怎么睡好就到了三点半,起来学习,但是一开始的学习没怎么进入状态,大概半个多小时才进入状态。
今天也就学了六七个小时吧。
总结一哈
今天进入了多线程的学习
了解了程序、进程和线程的概念
程序:是程序和指令的有序集合,本身没有任何运行的含义,是静态的。
进程:执行程序的一次执行过程,是一个动态的概念。它是系统资源分配的单位。
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个进程,不然没有存在的意义。
线程:CPU调度和执行的单位。
小总结:
1.main方法是主线程,是系统的入口,用于执行整个程序。
2.线程就是独立的执行路径
线程的创建
有三种创建方式:
1.自定义线程类继承Thread类
2.实现Runnable接口(推荐)
3.实现Callable接口(了解)
静态代理
静态代理模式总结:
1.真实对象和代理对象都要实现同一个接口(结婚Marry)
2.代理对象要代理真实角色
好处:
1.代理对象可以做很多真实对象做不了的事情
2.真实对象专注做自己的事情
示例代码(结婚例子)
package com.seawatcher.www.project01;
public class StaticProxy {
public static void main(String[] args) {
//真实对象
//Teacher teacher = new Teacher();老师要结婚
//把老师丢给婚庆公司
/* WeddingCompany weddingCompany = new WeddingCompany(new Teacher());
weddingCompany.Marriage();*/
//Runnable接口和Thread代理都有run方法,
//最后调用的是Thread的start方法,但实际执行的还是Runnable中的run方法中的方法体
//Thread代理真实对象(Runnable接口),调用start()方法Thread。
new Thread(()-> System.out.println("我爱你")).start();//lambda表达式
//精简代码
new WeddingCompany(new Teacher()).Marriage();
}
}
interface Marry{
void Marriage();
}
class Teacher implements Marry{
@Override
public void Marriage() {
System.out.println("老师要结婚了,很开心");
}
}
class WeddingCompany implements Marry{
//代理谁-真实目标角色
private Marry target;
public WeddingCompany(Marry target){
this.target = target;
}
@Override
public void Marriage() {
before();
this.target.Marriage();//真实对象 调用了一个结婚
after();
}
private void before() {
System.out.println("结婚之前,布置现场");
}
private void after() {
System.out.println("结婚之后,收款");
}
}
Lambda表达式的使用
Lambda表达式的出现是为了简化代码。
使用Lambda表达式的意义:
1.避免匿名内部类定义过多
2.让代码看起来更简洁
3.去掉一堆没有意义的代码,留下核心的逻辑。
函数式接口
当接口中只有一个抽象方法的时候,就是函数式接口。
对于函数式接口,可以通过Lambda表达式来创建接口对象。
函数式接口示例代码:
package com.seawatcher.www.project02;
public class TestLambda02 {
public static void main(String[] args) {
PrintRec printRec = null;
int x = 5;
//1.lambda表示简化
/*PrintRec printRec = (int row)-> {
for (int i = 0; i < row; i++) {
for (int j = row - i - 1; j >= 0; j--) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
};*/
//2.简化参数类型
/*printRec = (row)-> {
for (int i = 0; i < row; i++) {
for (int j = row - i - 1; j >= 0; j--) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
};*/
//3.简化括号
/*printRec = row-> {
for (int i = 0; i < row; i++) {
for (int j = row - i - 1; j >= 0; j--) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
};*/
//4.去掉花括号 要求只有一行代码
//前提是接口是函数式接口(接口中只有一个方法)
//多个参数也可以去掉参数类型 要去掉就都去了 但是不能简化参数括号
printRec = row-> System.out.println("I love u");
printRec.printRec(x);
/*printRec = new PrintRec() {//匿名内部类
@Override
public void printRec(int row) {
for (int i = 0; i < row; i++) {
for (int j = row - i - 1; j >= 0; j--) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
};*/
}
}
interface PrintRec{
void printRec(int row);
}
/*
class RecPrint implements PrintRec{
@Override
public void printRec(int row) {
}
}*/
收尾
放张JAY,推荐歌曲《枫》, 今日毕。