什么时候使用多线程:当一个程序 执行很长一段时间,但是程序执行的时候,操作者不想等待这段时间,而是想干些别的事情。此时需要使用多线程。
生成红包案例:
1:
2:由于红包数量较多,需要占用一段时间。所以要启动线程。
3:点击确认,直接执行线程中的代码。此时可以其他操作,而不影响。
代码如下;
<!-- 生成红包 -->
<form action="/newRedPacket/savePacket.html" method="post" onsubmit="return checkRecketForm()">
<div class="pop createPacketDiv" id="createPacketDivDiv">
<div class="popbg"></div>
<div class="layel" style="z-index: 999; width: 800px; margin-left: -400px;">
<h3 class="addtitle"><span id="mbtitle2">生成红包</span><i class="closeicon"></i></h3>
<div class="row">
<span>红包类型:</span>
<input type="hidden" id="redType2" name="redType"/>
<input type="hidden" name="redNewType" id="redNewType"/><!-- 红包类型的id -->
<span class="selectinput plate" style="width: 100px; margin-left: 20px;">
<span class="selectvalue" id="statusSel2">
<c:if test="${empty status}">全部</c:if>
<c:if test="${status==1}">普通红包</c:if>
<c:if test="${status==2}">VIP红包</c:if>
</span>
<i class="arrow arrowright"></i>
<ul class="option statusul">
<li data-id="0" onclick="setstatus2('','全部')">全部</li>
<li data-id="1" onclick="setstatus2(1,'普通红包')">普通红包</li>
<li data-id="2" onclick="setstatus2(2,'VIP红包')">VIP红包</li>
</ul>
</span>
名称<select style="WIDTH: 100px" id="title11" name="title" class="selectinput plate" onchange="title111()"><option>请选择</option></select>
满<select style="WIDTH: 100px" id="subMoney11" name="subMoney" class="selectinput plate" onchange="subMoney111()"><option>请选择</option></select>减
<input type="text" name="money" id="money11" class="input-com" disabled="true" style="width: 100px;">元
<input type="hidden" name="money22" id="money22">
</div>
<div class="row" id="glCode2" style="display: none;">
<span class="personattr">关联码:</span>
<select name="glId" id="glCode3" class="selectinput plate" style="margin-left: 0px;">
<option value="9999999">全部</option>
<c:forEach items="${glCodeList}" var="gl" varStatus="st">
<c:if test="${gl.id == glId}">
<option value="${gl.id }" selected="selected">${gl.glCode }</option>
</c:if>
<c:if test="${gl.id != glId}">
<option value="${gl.id }">${gl.glCode }</option>
</c:if>
</c:forEach>
</select>
</div>
<div class="row">
<span class="personattr">生成数量:</span>
<input type="text" name="counts" id="counts11" class="input-com">个
</div>
<div class="row" id="kouLingDiv">
<span class="personattr">口令:</span>
<input type="text" name="kouLing" id="kouLing" class="kouLing">
</div>
<div class="row">
<span class="personattr">有效期:</span>
<input type="radio" name="useType" value="1" onclick="timeStart()" checked="checked">时间阶段
<input type="radio" name="useType" value="2" onclick="timeEnd()">固定天数
</div>
<div class="row" id="timeDiv1" style="display: none;">
<span class="personattr">时间阶段</span>
<input type="text" onclick="WdatePicker({dateFmt:"yyyy-MM-dd"})"
class="input input-medium" name="useStartTime" id="useStartTime" placeholder="开始时间">
-
<input type="text" onclick="WdatePicker({dateFmt:"yyyy-MM-dd"})"
class="input input-medium" name="useEndTime" id="useEndTime" placeholder="结束时间">
</div>
<div class="row" id="timeDiv2" style="display: none;">
<span class="personattr">固定天数</span>
<input type="radio" name="dayCount" id="dayCount11" value="30">30天
<input type="radio" name="dayCount" value="10">10天
<input type="radio" name="dayCount" value="7">7天
</div>
<div class="row">
<input type="submit" class="confirm" value="确定" style="margin-left: 0px; margin-top: 30px;">
</div>
</div>
</div>
</form>
后台代码:
/**
* 保存生成的红包
* @param suRedNewPacket
* @param model
* @return
*/
@RequestMapping("/savePacket.html")
public String savePacket(
@RequestParam(value = "redNewType", required = false) final Long redNewType,
@RequestParam(value = "glId", required = false) final Long glId,
@RequestParam(value = "counts", required = false) final Integer counts,
@RequestParam(value = "kouLing", required = false) final String kouLing,
@RequestParam(value = "useType", required = false) final Byte useType,
@RequestParam(value = "redType", required = false) final Byte redType,
@RequestParam(value = "money22", required = false) final Float money,
@RequestParam(value = "useStartTime", required = false) final String startTime1,
@RequestParam(value = "useEndTime", required = false) final String endTime1,
@RequestParam(value = "dayCount", required = false) final String dayCount,
Model model) {
Thread t = new Thread(new Runnable(){//创建线程执行以下方法
public void run(){//线程的run方法
Date date = new Date();
SuRedNewPacket suRedNewPacket = new SuRedNewPacket();
SuRedGlCode code = new SuRedGlCode();
if(counts != null && counts != 0){
for(int i = 0;i<counts;i++){//导入红包个数
suRedNewPacket.setRedNewType(redNewType);
suRedNewPacket.setCounts(counts);
suRedNewPacket.setKouLing(kouLing);
suRedNewPacket.setUseType(useType);
suRedNewPacket.setMoney(money);
Date startTime = null;
Date endTime = null;
if(StringUtils.isNotBlank(startTime1)){
String startTimeStr = startTime1+" 00:00:00";
String endTimeStr = "";
if(StringUtils.isBlank(endTime1)){
endTimeStr = DateUtil.format(new Date(),"yyyy-MM-dd")+" 23:59:59";
}else{
endTimeStr = endTime1+" 23:59:59";
}
startTime = DateUtil.parse(startTimeStr, "yyyy-MM-dd HH:mm:ss");
endTime = DateUtil.parse(endTimeStr, "yyyy-MM-dd HH:mm:ss");
suRedNewPacket.setUseStartTime(startTime);
suRedNewPacket.setUseEndTime(endTime);
}else{
suRedNewPacket.setUseStartTime(null);
suRedNewPacket.setUseStartTime(null);
}
if(StringUtils.isNoneBlank(dayCount)){
suRedNewPacket.setDayCount(Integer.parseInt(dayCount));
}
//序列号
String sequenceNumber = null;
sequenceNumber = getCard();//生成12位序列号
for (;;){
sequenceNumber = checkSequenceNumber(sequenceNumber);
if (StringUtils.isNotBlank(sequenceNumber)) {
break;
}
}
suRedNewPacket.setSequenceNumber(sequenceNumber);
//兑换码
String dhm = "";
if(redType == 1){//普通红包6位数字加字母
dhm = puDhm();
suRedNewPacket.setGlId(null);
}else if(redType == 2){//vip红包8位数字
dhm = returnBarCode();
suRedNewPacket.setGlId(glId);
}else{
suRedNewPacket.setGlId(null);
}
suRedNewPacket.setDhm(dhm);
suRedNewPacket.setCreateDateTime(date);
suRedNewPacket.setUpdateTime(date);
suRedNewPacket.setStatus((byte)1);
suRedNewPacket.setInvalid((byte)0);
redNewPacketService.insertSelective(suRedNewPacket);
}
code.setId(glId);
code.setRedUse((byte)1);
redGlCodeService.updateByPrimaryKeySelective(code);
}
}
});
t.start(); //调用此线程
//返回前台页面,当flag=1的时候。页面显示操作成功。
return "redirect:/newRedPacket/packetList.html?flag="+1;
}