想做技术博客,但却更喜欢分享生活。

对线程池ExecutorService的关闭的研究

最近在使用ExecutorService的时候,对其关闭操作的概念非常模糊。查阅了许多文章、问答之后,有了一个总结。
shutdown:
1. 调用之后不允许继续往线程池内继续添加线程;
2. 线程池的状态变为SHUTDOWN状态;
3. 所有在调用shutdown()方法之前提交到ExecutorSrvice的任务都会执行;
4. 一旦所有线程结束执行当前任务,ExecutorService才会真正关闭。

shutdownNow():
1. 该方法返回尚未执行的task的List;
2. 线程池的状态变为STOP状态;
3. 阻止所有正在等待启动的任务,并且停止当前正在执行的任务;

2017-02-15

UnsupportedOperationException 的研究

最近设计的一个类中,有成员属性Map<String, List>,其因为某些奇怪的原因,在给value的List调用add或者remove方法时抛出了UnsupportedOperationException异常,于是对其进行了研究。

记一个在制作服务器过程中遇到的坑

关于HTTP 的响应头 Content-Range的记录。

Content-Range
用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]

全民普及HTTPS有意义吗?

我的回答是,有,不仅有意义,而且意义重大。
有些人可能不知道一种攻击方式叫做“中间人(Man In The Middle)攻击”。
我这里简单介绍一下中间人攻击的一种,局域网内的ARP欺骗。
什么是ARP?ARP是地址转换协议的英文缩写,是用来把IP地址转换为MAC地址的。
假设A(192.168.1.105)和B(192.168.1.100)在同一局域网内部,A想和B通信,那么A首先会发一个数据包到广播地址(192.168.1.255),该数据包内包含A的IP,A的MAC地址,目的(B)的IP,目的(B)的MAC地址,这个数据包会被发放给局域网内的所有主机,此时B收到包之后会进行返回,返回包的内容大致有B的IP,B的MAC地址,目的(A)的IP,目的(A)的MAC地址。A收到B的返回包之后,会将B的IP和MAC地址保存在ARP缓存表中。
因为A在保存B的地址的时候没有经过验证,所以就有了欺骗的可能。

2017-01-15

笔记本电脑独立显卡不正常工作的解决办法

至今为止遇到过两次这样的问题。
第一次是隔壁寝室的同学新买的电脑,因为打撸的时候忘插电,然后笔记本电池用完自动关机,之后插上电再开机打撸,发现fps低于正常水平。
第二次是女朋友的机子,没有插电开了一晚上,早上醒来已经电池用完自动关机了,之后再打游戏,发现fps极低。
第一次的解决方案是直接换机,因为电脑刚买不久,符合换机的条件,所以二话不说就直接换了。
第二次,因为电脑已经买来2年多了,所以不可能换机或者保修什么的,必须自己想办法解决。
我首先是抱着重启试试的心态去尝试修复,未果。之后使用重装大法,还是失败。
接下来我慢慢总结起经验,发现问题的都是由“电池用完自动关机”而引发的,所以我认为,该异常可能和电池有关。

程序员必备经验之从项目中来与到项目中去

很多朋友问我最近在忙什么?我很奇怪为什么他们能一眼就看出我在“忙”。后来仔细想想,认为这和我的生活习惯很有关系。
平时自由散漫惯了,等到一有事情的时候就手忙脚乱,天天板着脸,看上去像天塌了一样。
哦不,至少对前几天的我来说,是“天就要塌了”。
多变的需求,紧凑的时间,打的我措手不及。
恨不得一天掰成两天用,一台电脑劈成两台电脑用,一个人分身成两个人用。

2016-12-07

关于Java 8 新特性,default方法

Java8的一个重要的特性就是引入了函数式方法,其中Collection接口中增加了新的stream()方法。
我们都知道在Java的接口中只能定义方法,而不能对方法进行具体实现。其方法的实现必须要到实现了该接口的非抽象子类中实现。
因为接口导致的这个语法限制,使得要实现Collection接口的stream()方法全覆盖变得异常困难。难道所有继承了Collection接口的类中都要重写stream()方法的实现吗?显然不是的。机智的Java开发工程师们在Java8中引入了这样一个新的概念——’default’方法。

2016-11-06

微信红包算法的分析

发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。
当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。
注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。
这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。
如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

2016-11-05

Java 泛型三大使用场景

泛型是Java中比较重要的点。本文分析了泛型的三种使用场景,并且带有示例代码。
1. 泛型类
2. 泛型接口
3. 泛型方法
4. 练习