克隆的典型使用:原型模式
*
*
* 原型模式Prototype Pattern是用于创建重复的对象,同时又能保证性能。
* 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
*
* 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创
* 建对象的代价比较大时,则采用这种模式
*
* 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
*
* 优点:1、性能提高。 2、逃避构造函数的约束。
* 缺点:1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,
* 但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者
* 引用含有循环结构的时候。 2、必须实现Cloneable接口。
*
* 注意:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一
* 个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现
* Serializable 读取二进制流。
进程
*
*僵尸进程和孤儿进程
*
* 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,
* 此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后
* init会回收其占用的相关资源 ---是对系统资源的浪费,必须解决
*
* 孤儿进程是一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿
* 进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
* ---没有什么危害
并行与并发
* - 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
* - 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面
* 不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资
* 源往往产生瓶颈,我们会用TPS(每秒钟处理的事务数)或者QPS(每秒钟处
* 理的请求数)来反应这个系统的处理能力。
*
* ### 主线程
* 线程是进程中的一个实体,用来描述进程的执行,它负责执行包括在进程的地
* 址空间中的代码。
*
* 创建一个进程时,它的第一个线程称为主线程,它由系统自动生成
* * - 它是产生其他子线程的线程
* - 通常它是最后完成执行,因为它执行各种关闭动作。注意这里不绝对
*/
创建线程的四种方法:
1.继承thread
(1)创建一个类继承Thread类,重写run()方法,将所要完成的任务代码写进run()方法中;
(2)创建Thread类的子类的对象;
(3)调用该对象的start()方法,该start()方法表示先开启线程,然后调用run()方法;
2.实现Runnable接口
(1)创建一个类并实现Runnable接口
(2)重写run()方法,将所要完成的任务代码写进run()方法中
(3)创建实现Runnable接口的类的对象,将该对象当做Thread类的构造方法中的参数传进去
(4)使用Thread类的构造方法创建一个对象,并调用start()方法即可运行该线程
3.使用Callable和Future创建线程
(1)创建一个类并实现Callable接口
(2)重写call()方法,将所要完成的任务的代码写进call()方法中,需要注意的是call()方法有返回值,并且可以抛出异常
(3)如果想要获取运行该线程后的返回值,需要创建Future接口的实现类的对象,即FutureTask类的对象,调用该对象的get()方法可获取call()方法的返回值
(4)使用Thread类的有参构造器创建对象,将FutureTask类的对象当做参数传进去,然后调用start()方法开启并运行该线程。
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
4.线程池
好处:
1、提高响应速度(减少了创建新线程的时间)
2、降低资源消耗(重复利用线程池中线程,不需要每次创建)
3、便于线程管理