技术开发 频道

原型模式之实战个性化电子账单

  运行结果如下所示。

标题:XX银行国庆信用卡抽奖活动    收件人:fjQUm@ZnkyPSsL.com    ....发送成功!
标题:XX银行国庆信用卡抽奖活动    收件人:ZIKnC@NOKdloNM.com    ....发送成功!
标题:XX银行国庆信用卡抽奖活动    收件人:zNkMI@HpMMSZaz.com    ....发送成功!
标题:XX银行国庆信用卡抽奖活动    收件人:oMTFA@uBwkRjxa.com    ....发送成功!
标题:XX银行国庆信用卡抽奖活动    收件人:TquWT@TLLVNFja.com    ....发送成功!
标题:XX银行国庆信用卡抽奖活动    收件人:rkQbp@mfATHDQH.com    ....发送成功!

  由于是随机数,每次运行都有所差异,不管怎么样,我们这个电子账单发送程序是编写出来了,也能正常发送出来。我们再来仔细的想想,这个程序是否有问题?Look here,这是一个线程在运行,也就是你发送是单线程的,那按照一封邮件发出去需要0.02秒(够小了,你还要到数据库中取数据呢),600万封邮件需要……我算算(掰指头计算中……),恩,是33个小时,也就是一个整天都发送不完毕,今天发送不完毕,明天的账单又产生了,积累积累,激起甲方人员一堆抱怨,那怎么办?

  好办,把sendMail修改为多线程,但是你只把sendMail修改为多线程还是有问题的呀,你看哦,产生第一封邮件对象,放到线程1中运行,还没有发送出去;线程2呢也启动了,直接就把邮件对象mail的收件人地址和称谓修改掉了,线程不安全了,好了,说到这里,你会说这有N多种解决办法,我们不多说,我们今天就说一种,使用一种新型模式来解决这个问题:对象的拷贝功能来解决这个问题,类图稍作修改,如图13-2所示。

图13-1 修正后的发送电子账单类图

  增加了一个Cloneable接口(Java自带的一个接口), Mail实现了这个接口,在Mail类中覆写clone()方法,我们来看Mail类的改变,如代码清单13-4所示。

0
相关文章