多线程下 SimpleDateFormat

来源:互联网 发布:电脑关机软件 编辑:程序博客网 时间:2024/05/21 02:50

在爬虫爬到网页后,可能需要对时间进行格式化,以时间戳的方式录入数据库。但我们前提不知道不同的网站的时间格式化方式,但又懒得去数据库里面对每个站点进行一一配置,所以,在程序里面,直接构造了一堆 SimpleDateFormat 对象,作为静态对象,将最有可能命中的放于前面,每次用这个队列去格式化,符合了就直接返回。爬虫跑了几十分钟后,发现报了一个 Exception , Exception in thread "content parse - thread-3" java.lang.NumberFormatException: multiple points .但一般情况下,进行格式化时,默认只需要 catch ParseException,于是,这个 exception 出现时,由于没有 catch,其级别又比较高,会导致当前线程退出。经过查询相关文档,SimpleDateFormat 不是线程安全的,也就是说,它会保存某个中间状态,多个线程同时使用一个 SimpleDateFormat 对象会同时对它的状态进行更改,造成格式化后的结果不正确,这是最好的情况,因为谁也不知道此时发生了错误,线程不会退出,但这个错误会非常难排查。最坏的情况就是,多个线程更改了 SimpleDateFormat  的状态,使其处于一个错误的状态,上面报出的问题,我猜想是因为 SimpleDateFormat  内部使用了浮点数,并且线程会更改这个浮点数,比如,将某一位上放置一个小数点,结果造成了那个浮点数包含了两个小数点,所以就报了 multiple points  这个异常。

0 0