您的位置:首页 > 编程语言 > Java开发

Java多线程简单实例

2017-06-05 11:28 363 查看
最近为了提高批处理程序的统计效率,将程序改为多线程执行,由原来的单一线程计算改为五个线程同时计算,大大缩短了统计时间。实现原理很简单,就是将需要计算的内容分成五份交给五个线程进行统计,五个线程相互之间没有影响。

程序

public class GenerateMonitorCompanyAndPersonRisk implements Runnable{

private List<SysAccount> accountList;

public GenerateMonitorCompanyAndPersonRisk(List<SysAccount> accountList) {
this.accountList = accountList;
}

@Override
public void run() {
MonitorCompanyService monitorCompanyService = new MonitorCompanyService();

MonitorCompanyRiskAnalysisService monitorCompanyRiskAnalysisService = new MonitorCompanyRiskAnalysisService();

MonitorRelationCompanyRiskAnalysisService monitorRelationCompanyRiskAnalysisService = new MonitorRelationCompanyRiskAnalysisService();

MonitorRelationPersonRiskAnalysisService monitorRelationPersonRiskAnalysisService = new MonitorRelationPersonRiskAnalysisService();

MonitorRelationCompanyService monitorRelationCompanyService = new MonitorRelationCompanyService();

MonitorRiskReportService monitorRiskReportService = new MonitorRiskReportService();

MonitorRelationPersonService monitorRelationPersonService = new MonitorRelationPersonService();

MonitorUserEventLevelCompanyNumTrendService monitorUserEventLevelCompanyNumTrendService = new MonitorUserEventLevelCompanyNumTrendService();

String accountId = "";

for(SysAccount account : accountList){
accountId = account.getAccountId();

//生成监控企业风险分析
monitorCompanyRiskAnalysisService.generateMonitorCompanyRiskAnalysis(accountId);

//生成关系企业风险分析
monitorRelationCompanyRiskAnalysisService.generateMonitorRelationCompanyRiskAnalysis(accountId);

//生成关系个人风险分析
monitorRelationPersonRiskAnalysisService.generateMonitorRelationPersonRiskAnalysis(accountId);

//更新关系企业风险信息
monitorRelationCompanyService.updateMonitorRelationCompanyRisk(accountId);

//更新关系自然人风险信息
monitorRelationPersonService.updateMonitorRelationPersonRisk(accountId);

//更新动态监控企业风险信息
monitorCompanyService.updateMonitorCompanyRisk(accountId);

//生成用户动态监控各事件类型企业数量趋势
monitorUserEventLevelCompanyNumTrendService.generateMonitorUserEventLevelCompanyNumTrend(accountId);

//统计动态监控风险报告
monitorRiskReportService.generateMonitorRiskReport(accountId);
}
}

public static void main(String[] args) {
SysAccountService sysAccountService = new SysAccountService();

MonitorCompanyEventService monitorCompanyEventService = new MonitorCompanyEventService();

MonitorPersonEventService monitorPersonEventService = new MonitorPersonEventService();

//获取企业和个人的风险事件
monitorCompanyEventService.getTodayCompanyEvent();

monitorPersonEventService.getTodayPersonEvent();

//获取所有有效的账号
List<SysAccount> accountList = sysAccountService.queryEffectiveSysAccount();

//分五个线程统计风险信息
int num = accountList.size() / 4;

List<SysAccount> accountList1 = accountList.subList(0, num*1);
List<SysAccount> accountList2 = accountList.subList(num*1, num*2);
List<SysAccount> accountList3 = accountList.subList(num*2, num*3);
List<SysAccount> accountList4 = accountList.subList(num*3, num*4);
List<SysAccount> accountList5 = accountList.subList(num*4, accountList.size());

GenerateMonitorCompanyAndPersonRisk generator1 = new GenerateMonitorCompanyAndPersonRisk(accountList1);
GenerateMonitorCompanyAndPersonRisk generator2 = new GenerateMonitorCompanyAndPersonRisk(accountList2);
GenerateMonitorCompanyAndPersonRisk generator3 = new GenerateMonitorCompanyAndPersonRisk(accountList3);
GenerateMonitorCompanyAndPersonRisk generator4 = new GenerateMonitorCompanyAndPersonRisk(accountList4);
GenerateMonitorCompanyAndPersonRisk generator5 = new GenerateMonitorCompanyAndPersonRisk(accountList5);

Thread thread1 = new Thread(generator1);
Thread thread2 = new Thread(generator2);
Thread thread3 = new Thread(generator3);
Thread thread4 = new Thread(generator4);
Thread thread5 = new Thread(generator5);

thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
}
}


这里没有涉及到线程的同步、阻塞等等,所以很容易实现。我是通过实现Runnable接口来实现多线程的,相对继承Thread类有以下几个优点:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: