1700461460
sb.append(source.charAt(rand.nextInt(source.length())));
1700461461
1700461462
}
1700461463
1700461464
return sb.toString();
1700461465
1700461466
}
1700461467
1700461468
}
1700461469
1700461470
运行结果如下所示:
1700461471
1700461472
标题:XX银行国庆信用卡抽奖活动 收件人:fjQUm@ZnkyPSsL.com……发送成功!
1700461473
1700461474
标题:XX银行国庆信用卡抽奖活动 收件人:ZIKnC@NOKdloNM.com……发送成功!
1700461475
1700461476
标题:XX银行国庆信用卡抽奖活动 收件人:zNkMI@HpMMSZaz.com……发送成功!
1700461477
1700461478
标题:XX银行国庆信用卡抽奖活动 收件人:oMTFA@uBwkRjxa.com……发送成功!
1700461479
1700461480
标题:XX银行国庆信用卡抽奖活动 收件人:TquWT@TLLVNFja.com……发送成功!
1700461481
1700461482
标题:XX银行国庆信用卡抽奖活动 收件人:rkQbp@mfATHDQH.com……发送成功!
1700461483
1700461484
由于是随机数,每次运行都有所差异,不管怎么样,我们这个电子账单发送程序是编写出来了,也能正常发送。我们再来仔细地想想,这个程序是否有问题?Look here,这是一个线程在运行,也就是你发送的是单线程的,那按照一封邮件发出去需要0.02秒(够小了,你还要到数据库中取数据呢),600万封邮件需要33个小时,也就是一个整天都发送不完,今天的不发送完,明天的账单又产生了,日积月累,激起甲方人员一堆抱怨,那怎么办?
1700461485
1700461486
好办,把sendMail修改为多线程,但是只把sendMail修改为多线程还是有问题的呀,产生第一封邮件对象,放到线程1中运行,还没有发送出去;线程2也启动了,直接就把邮件对象mail的收件人地址和称谓修改掉了,线程不安全了。说到这里,你会说这有N多种解决办法,其中一种是使用一种新型模式来解决这个问题:通过对象的复制功能来解决这个问题,类图稍作修改,如图13-2所示。
1700461487
1700461488
1700461489
1700461490
1700461491
图13-2 修改后的发送电子账单类图
1700461492
1700461493
增加了一个Cloneable接口(Java自带的一个接口),Mail实现了这个接口,在Mail类中覆写clone()方法,我们来看Mail类的改变,如代码清单13-4所示。
1700461494
1700461495
代码清单13-4 修改后的邮件类
1700461496
1700461497
public class Mail implements Cloneable{
1700461498
1700461499
//收件人
1700461500
1700461501
private String receiver;
1700461502
1700461503
//邮件名称
1700461504
1700461505
private String subject;
1700461506
1700461507
//称谓
1700461508
1700461509
private String appellation;
[
上一页 ]
[ :1.70046146e+09 ]
[
下一页 ]