1 ExecutorService是是一个接口,继承了Executor
2 而Executor亦是一个接口,该接口只包含了一个方法void execute(Runnable command)
3 Executors
该类是一个辅助类,此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
此类支持以下各种方法:
• 创建并返回设置有常用配置字符串的 ExecutorService 的方法。
• 创建并返回设置有常用配置字符串的 ScheduledExecutorService 的方法。
• 创建并返回“包装的”ExecutorService 方法,它通过使特定于实现的方法不可访问来禁用重新配置。
• 创建并返回 ThreadFactory 的方法,它可将新创建的线程设置为已知的状态。
• 创建并返回非闭包形式的 Callable 的方法,这样可将其用于需要 Callable 的执行方法中。
4、创建ExecutorService的方法:
newFixedThreadPool(); 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程
newSingleThreadExecutor ;线程数量为1的fixedThreadPool.如果像这个提交了多个任务,这些任务将会排队,每个任务都会在下个任务开始直接运行结束,所有的任务使用相同的线程
void shutdown() :启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用
void execute(Runnable command) 在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor实现决定。
工作当中同步接口同步eas系统中的部门,人员,成本中心等数据,由于数据量比较大,所以采用线程池技术,大大缩短了同步的时间,代码如下:
public static boolean changeDeptForOA(JSONArray jsonArray, boolean fullFlag) { // 当前系统时间 String nowDateTime = DateUtils.getStringNowDate("yyyy-MM-dd HH:mm:ss"); THREAD_POLL = Executors.newFixedThreadPool(THREAD_COUNT); try { if (jsonArray.size() > 1) { jsonArray.remove(0); log.info("推送部门信息"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject obj = jsonArray.getJSONObject(i); // 如果是宜信则上级ID为空跳出循环不修改 if (!"".equals(getStringByObj(obj.get("FNUMBER"))) && "CE".equals(getStringByObj(obj.get("FNUMBER")))) { continue; } DBUpdateThread dbThread = new DBUpdateThread(obj, nowDateTime, "department"); THREAD_POLL.execute(dbThread); } THREAD_POLL.shutdown(); //判断线程结束 while (true) { if (THREAD_POLL.isTerminated()) { log.info("推送部门信息完成"); break; } Thread.sleep(1000); } if (fullFlag) { //全量更新后,如果没有更新的话,设置为封存状态 String updateSql2 = "update to_horizon_dept t set t.f4 = '1' where t.createdate < '" + nowDateTime + "' and t.dept_code != 'CE'"; Access.executeUpdate(updateSql2, null); } } } catch (Exception e) { e.printStackTrace(); return false; } finally { // 更新上级为空的组织 String updateDeptSql = "update to_horizon_dept d set d.parent_id = (select id from to_horizon_dept dd where dd.dept_code = d.parent_code) where d.parent_id is null and d.dept_code !='CE' "; Access.executeUpdate(updateDeptSql, null); // 更新缓存,初始化所有部门 if (jsonArray.size() > 0) { MemoryTreeLoader.loadAllDept(); } } return true; }