周报
代码行数:
周一 | 704 |
周二 | 481 |
周三 | 571 |
周四 | 589 |
周五 | 595 |
周六 | 520 |
周日 | 537 |
遇到的问题:
没用过的方法AtomicInteger
Insert
Proto
currentTimeMillis
@RequestParam
BufferedReader
UriComponents
RestTemplate
OSS
不清楚在什么情况下使用IOException
测试questionStat接口时,对使用到的DateUtils类很陌生
接触了新项目haomo-permisison,不会用linux系统链接git
需要开发一个生成随机码的接口,需要用到getUnlimitedQRCode接口
解决问题以及知识点:
AtomicInteger用于多线程下线程安全的数据读写操作,避免使用锁同步,底层采用CAS实 现,内部的存储值使用volatile修饰,因此多线程之间是修改可见的。
接口:InsertMapper<T>
方法:int insert(T record);
说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
protobuf是一种灵活的、高效的、自动化的序列化机制。实现步骤:
(1)定义.proto文件:我们在这个文件中描述我们序列化的信息,类似于bean类。
(2)根据.proto生成对应的类文件,上面这个proto就像是一个模板,现在我们要根 据这个模板创建出一个java类。
(3)序列化。
System.currentTimeMillis()用于获取当前系统时间,以毫秒为单位。currentTimeMillis 该值表示:当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒 之间的时间差,以毫秒数为单位。
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数 的注解)
BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行, 可以通过构造函数指定缓冲区大小也可以使用默认大小
UriComponents:可以利用其构造类UriComponentsBuilder从URI、Http 链接、URI 路径中 初始化UriComponents。
IOException是输入或输出异常(即写读异常)为Exception的子类
什么是异常?
异常是指程序在运行过程中发生的,由于外部问题导致的程序运行异常事件,异常的发 也是一个对象,程序发生异常就会产生一个异常对象。
异常发生的原因有很多,通常包含以下几大类:
用户输入了非法数据。
要打开的文件不存在。
网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理 错误引起的。
要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
RestTemplate 是由 Spring 提供的一个 HTTP 请求工具,它提供了常见的REST请求方案的 模版
OSS对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具
查看DateUtils中使用到的方法代码,并理解掌握
通过搜索,学会如何在终端使用git,并启动项目
getUnlimitedQRCode该接口用于获取小程序码,适用于需要的码数量极多的 业务场 景。通过该接口生成的小程序码,永久有效,数量暂无限制。
线程的基本概念
一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。
一个线程就是在进程中的一个单一的顺序控制流.
而单个进程可以拥有多个并发执行的任务,每个任务都好像有自己的CPU一样,而其底层的机制就是切分CPU的时间,也就是CPU将轮流给每个任务分配其占用时间。
每个任务都觉得自己在一直占用CPU,而事实上是将CPU时间划分成片段分配给所有的任务。
在多个CPU的环境下,多线程的运作,可以极大的提供程序的运行速度,这就是线程存在的意义。
正常线程的五大状态 :新建状态,就绪状态,运行状态,阻塞状态,死亡状态
初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。
注意:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中
阻塞(BLOCKED):线程在获取synchronized排他锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作线程显式地唤醒(通知或中断)。
限期等待(Timed Waiting)状态:该状态不同于WAITING,处于这种状态的线程也不会被分配CPU执行时间,不过无须等待其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。
死亡(Dead)状态: 线程执行完了或者因异常退出了run()方法,该线程生命周期结束。
心得体会:
昨天受神秘高人点拨,为我指点迷津,我亦受益匪浅:
1.什么是好的日报?
让人一目了然,看一眼就能知道这一天做了什么,收获了什么
2.通过一个非常简单的接口的验收,暴露出自身的问题
学习不仅要有宽度,亦要有深度,
要多问自己几个为什么,
3.要坚持正确的学习方法,要会总结,
学了什么
遇到了什么问题
我对此的思考
收获了什么知识点
这周终于为公司创造了些许价值(虽然还是在拖后腿),我也很喜欢这种证明自己感觉,下周前辈给我分配了三个简单的接口,他说这三个接口是他一天的工作量,需要我在3天左右完成,我感受到压力和挑战,这三个接口使用到的知识点几乎都是我的盲区或者薄弱点,大致思路已经基本确定,需要的实现技术我还需要加强。