继承Thread类
- 
子类继承Thread类具备多线程能力
 - 
启动线程:子类对象.start()
 - 
不建议使用:避免oop单继承局限性
 
实现Runnable接口
- 
实现接口Runnable具有多线程能力
 - 
启动线程:传入目标对象+Thread对象.start()
 - 
推荐使用:避免单继承局限性,可能一个对象被多个线程使用
 
多个线程同时操作同一个对象
问题:多个线程操作同一个资源,可能会出现资源冲突问题
实现Callable接口
- 
实现Callable接口,需要返回值类型
 - 
重写call方法,需要抛出异常
 - 
创建目标对象
 - 
创建执行服务
 - 
提交执行
 - 
获取结果
 - 
关闭服务
 
抽象角色:声明真实对象和代理对象的共同接口。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象。
同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
Lamda表达式
学习前提:
为什么使用
- 
避免匿名内部类定义过多
 - 
可以使代码更简洁
 - 
去掉无意义代码,留下核心逻辑
 
理解函数式接口
定义:只包含唯一一个抽象方法的接口,如:
public interface Runnable{
 public abstract void run();
}
对于函数式接口,我们可以通过lamda表达式来创建该接口的对象。
推导逻辑:
package JavaText.Text;
public class LamdaTest {
 //3.静态内部类
 static class like2 implements ILike{
   public void lamda(){
     System.out.println("I like lamda2");
    }
  }
 public static void main(String[] args) {
   ILike like = new like();
   like.lamda();
   like2 like2=new like2();
   like2.lamda();
   //4.局部内部类
   class like3 implements ILike{
     public void lamda(){
       System.out.println("I like lamda3");
      }
    }
   like = new like3();
   like.lamda();
   //5.匿名内部类,没有类的名称,必须借助接口或父类
   like =new ILike(){
     @Override
     public void lamda(){
       System.out.println("I like lamda4");
      }
    };
   like.lamda();
   //6.lamda表达式
   like=()->{
     System.out.println("I like lamda5");
    };
   like.lamda();
  }
}
//1.定义一个函数式接口
interface ILike{
 void lamda();
}
//2.常用类
class like implements ILike{
 public void lamda(){
   System.out.println("I like lamda1");
  }
}
Lamda表达式其实就是省略掉那些唯一不可变的东西,如在这一段代码当中:
//5.匿名内部类,没有类的名称,必须借助接口或父类
   like =new ILike(){
     @Override
     public void lamda(){
       System.out.println("I like lamda4");
      }
    };
   like.lamda();
   //6.lamda表达式
   like=()->{
     System.out.println("I like lamda5");
    };
   like.lamda();
----
 new ILike(){
     @Override
     public void lamda(),括号之前的代码都是唯一不可变的,因此可以省略,而括号之后的代码是自己定义的因此保留括号以后的代码在加上->即可。