ExecutorService使用情况

本文介绍了如何使用Java的ExecutorService接口实现线程池技术,并详细解释了newFixedThreadPool方法的应用场景。通过具体案例展示了如何利用线程池进行部门信息同步,有效提升数据处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }

 

 

转载于:https://www.cnblogs.com/zhouyanan/p/5828770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值