本系列文章旨在学习整理MyBatis的一些知识。本文是本系列的第一篇,用来介绍JDBC的内容,本文不是纯新手教程,如果有疑问,请查询官方文档。
关于写技术博客的碎碎念
曾经写过一段时间“技术博客”,但是都没坚持下来。“技术博客”打引号是因为现在看来,那些文章并不算真正的技术博客,有为了找工作而做的各种东拼西凑、还有些纯粹就是书本或者技术文档的摘抄和贴图。严格意义上算不得技术博客。
现在有时间坐下来好好想想,要不要写技术博客,怎么写技术博客(如果要写)这几个萦绕在心头的问题。
如果在很长的时间尺度中观察,想在事业上取得成就,把自己学到的积累并用自己的方式结构化是必要的,而写技术博客是一种方式。之前写技术博客总是坚持不下来,失败的原因很大程度上是:写博客不是为了让自己成长,而是为了在找工作时简历上多点东西。这种想法现在看来十分短视和肤浅,失败只是时间问题。如果是为了自己能在以5年为时间尺度总结自己的能力成长,那么写技术博客是个不错的选择。
写技术博客还是以兴趣和目标驱动为主。找一个合适的平台,坚持下去。要不断的提醒自己,写文章是为了提升自己的知识储备,找工作或者别人的关注都是附带的,那些并带不来长久的快乐和提升。
2022-08-05随笔
在最近读了一些书,但是人生还是没有太大的起色,感觉总是对生活提不起热爱。内心仍有诸多纠葛和自我拉扯。
很多时候其实不是不知道答案,而是不理解答案。觉得自己按照自己的方式走也不会太差,但是结果是“失之毫厘,差之千里”。但是日子总是要过,而且希望越过越好。一些努力不是深彻的,但是仍然值得鼓励,因为只有慢慢的坚持,最终从整体来看,才是健康的、昂扬的。
听讲座有感-技术驱动业务
这是听的公司讲关于技术人如何后续发展的讲座,听讲座不能只作机械的记忆,而是应该结合自己的理解,去深入理会和吸收。因为讲座一般是一个人关于自己一段时间内的行为以及收获的总结,它可以帮助我们少走一些弯路,提供更清晰的发展路径。
演讲主题是《技术驱动业务》。
Some Words In 2020
最近准备提离职去南京工作,对近两年做个总结。
1. 学习到的
- 得到了一些教训,对自己不理解或者自身价值观不接受的行为,不过早表露态度,多观察,多思考。
- 整体上对业务的理解有一定深入。在做一个产品或者功能时,不再仅着急实现预定好的功能,而是先思考功能是否完善,流程是否形成闭环,之后再来设计开发。相对以前有很多进益。
- 技术上学习到了一些学习的方法,例如源码阅读,很多工具和使用,代码设计也有提高。
2. 自身显露出的缺点
- 没有从长远思考问题的习惯,无论是工作还是生活。缺乏深入思考的能力和习惯,只有焦虑是不足以成事的。
- 生活中,对于负面的事,应对还是欠妥,导致自己自身状态不好。
- 思考一件事更多的还是在如何做以及实现方式等较为表面的层次,没有深层次考虑它的背景,演进过程已经当前方案是否合理,能否从根源上解决问题。这些思考在平时比较欠缺,也因为工作时间紧张,没有抽出精力来思考。
- 技术上还是欠缺,对应用的技术缺乏深度和研究的热情,只停留在应用的层面,而缺乏深入理解的动作,这个对后续发展不利。应用技术的优势和劣势缺乏系统的总结,这是深度上的缺失;应用技术选型的贫乏,这是广度上的缺失。
- 身体缺乏锻炼,导致身体亚健康。
3. 对未来的展望
- 在生活中多思考,或者说多考虑一下未来的可能性和发展规划,避免抽象的,不清晰的发展路径,而是要规划尽量合理的,相对细致的,可完成的,有时间限制的未来发展路径。
- 锻炼身体,保持健康的体魄。
- 为人处世,多看多想,多关心家人,和朋友交好。
- 技术多探究深度和广度,对技术有所坚持,厚积薄发,贵在坚持。
- 工作不只追求完成工作,而是尝试慢慢建立自己在部门,在公司,在业界的口碑,经营好自己。
- 培养自己的爱好,享受生活。
FutureTask
1. Runnable, Callable, Future, FutureTask
a. Runnable
Runnable代表一个可以被线程执行的任务,其中只有一个run()
方法1
2
3
4
5
6public interface Runnable {
/**
* 只有一个无参方法run(),当线程执行时,会调用这个run方法
*/
public abstract void run();
}
Thread类继承了Runnable接口, 其中也有Runnable的引用,它的run方法就是执行引用的Runnable实例的run方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31public class Thread implements Runnable {
private Runnable target;
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
boolean started = false;
try {
// 底层调用JNI方法start0()向OS申请线程资源
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
private native void start0();
@Override
public void run() {
// target在构造方法中设置,线程在执行具体的业务逻辑时会调用run方法
if (target != null) {
target.run();
}
}
}