面向对象的设计原则:
1、单一职责原则:一个类只应该做和一个职责相关的业务,不要让一个类承担过多的职责。(高内聚)
2、开闭原则:软件实体应该面向修改关闭,面向扩展开放。其实现的核心就是抽象。将相同的代码抽取出来,便于代码重用,这就是闭。将不同的代码抽取出来,便于功能的拓展,这就是开。开闭原则是设计原则的核心原则。
3、依赖倒置原则:面向抽象编程,不要面向具体编程。尽量使用抽象耦合代替具体耦合。(低耦合)
4、聚合/组合复用原则:尽量使用聚合/组合达到代码复用,少用继承实现代码复用。因为在java中只能单根继承,无法使用继承达到多个类代码的重用。但是使用聚合/组合方式可以实现多个类代码的重用。
5、里氏替换原则:父类出现的地方,子类一定可以替换。如果父类中的方法在子类中发生了畸变,则应该断开父子关系。父类中的属性和方法,子类无条件继承。这样容易造成父类方法在子类中不适用情况。所以,如果父类方法不能全部适用于子类,则建议断开父子关系,采用聚合/组合达到代码复用。
6、接口隔离原则:使用专门的接口比用统一接口好,便于项目的组织和分工。不要让开发者面对自己用不到的方法。
7、迪米特法则:软件实体之间应该尽量减少交互,不要因为一个类业务的变化,而导致另一个类的变化。(外观模式)
多任务处理:一个任务没有完成时,又在进行别的任务。
多任务处理有两种类型:基于进程和基于线程
进程是指一种“自包容”的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存
在一个程序中,能独立运行的程序片段叫做“线程”(Thread),线程是进程内部单一的顺序控制流
一个进程拥有多个线程。多个线程共享一个进程的内存空间。
主线程:简单的说,main方法一执行,就开启了主线程。每个进程至少都有一个主线程。
主线程的特点:
1、最先开始
2、最后结束
3、产生其他的子线程
4、子线程结束,清理子线程占用的内存资源
一个程序一运行,至少开始开启两个线程,主线程和垃圾回收线程
创建线程有两种方式:
1、继承Thread类,重写run()方法
2、实现Runnable接口,实现run()方法
启动线程采用start()方法
调用线程类中的run()方法和start()方法的区别
调用start()方法,会在主线程之外,单独开启子线程,多个线程同时执行。
调用run()方法,是普通方法调用,不会开启子线程,是单任务处理。在一个任务结束后,才能执行下一个任务
线程的优先级
线程的优先级是指,当两个或两个以上的线程同时处于就绪状态时,优先级高的线程会优先得到执行。
优先级有10个级别,越高优先级越高。setPriority(int newp)设置优先级、getPriority()得到优先级
线程的同步
线程同步是指,当两个或两个以上的线程,同时访问同一个资源时,为了确保数据的安全,只允许同一个时间点,同一个共享资源只被一个线程进行访问
线程同步带来的结果:1、数据安全,2、效率低下。