Process 与 Thread(20-12-08)
进程是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位
一个进程可以包含若干个线程,一个进程至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。
核心概念:
- 线程就是独立的执行路径;
- 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程, gc线程
- main()称之为主线程,为系统的入口,用于执行整个程序;
- 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。
- 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
- 线程会带来额外的开销,如cpu调度时间,并发控制开销。
- 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
线程创建
Thread class----> 继承Thread类(重点)
Runnable接口----> 实现Runnable接口(重点)
Callable接口----> 实现Callable接口(了解)
方式一:
继承Thread类,重写run()方法,调用start开启线程
注意,线程开启不一定立即执行,由CPU调度执行
//启动线程start()开启方式
线程对象.start();
不建议使用:避免OOP单继承局限性
方式二:
定义MyRunnable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
//启动线程start()开启方式
new Thread(线程对象).start();
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
方式三:
实现Callable接口(了解即可),需要返回值类型
重写call方法,需抛出异常
创建目标对象
创建执行服务:ExecutorService ser=Executor.newFixedThreadPool(1);
提交执行:Future
获取结果:boolean r1=result1.get();
关闭服务:ser.shutdownNow();
Lambda表达式(20-12-08)
只有一个方法的才叫 函数式接口 才可以用 lambda
public class TestLambda1 {
public static void main(String[] args) {
ILove love=(int a)->{//lambda表达式
System.out.println("i love you-->"+a);
};
love.love(520);
//总结
//lambda表达式只能是在只有一行代码的情况下才能简化为一行,如果有多行,那么就要代码块包裹。
//前提是接口为函数式接口,只有一个方法的才叫 **函数式接口** 才可以用 lambda表达式
//多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号。
}
}
interface ILove{
void love(int a);
}
静态代理模式(20-12-08)
总结://要使用lambda表达式
真实对象和代理对象都要实现同一个接口
代理对象要代理真实对象
好处:
代理对象可以做很多真实对象做不了的事
真实对象可以专注做自己的事