多线程(线程池)遍历集合

线程池的参数说明:

corePoolSize:核心线程数

maximumPoolSize:最大线程数

keepAliveTime:最大空闲时间

unit:最大空闲时间单位

workQueue:任务队列

handler:拒绝策略,有以下四种

(1)ThreadPoolExecutor.AbortPolicy 丢弃任务,并抛出 RejectedExecutionException 异常。

(2)ThreadPoolExecutor.CallerRunsPolicy:该任务被线程池拒绝,由调用 execute方法的线程执行该任务。

(3)ThreadPoolExecutor.DiscardOldestPolicy : 抛弃队列最前面的任务,然后重新尝试执行任务。

(4)ThreadPoolExecutor.DiscardPolicy,丢弃任务,不过也不抛出异常。

也可以自己实现RejectedExecutionHandler接口来自定义拒绝策略

示例代码:

// 创建线程池遍历集合
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,2,2,
        TimeUnit.SECONDS,new ArrayBlockingQueue<>(10),new ThreadPoolExecutor.AbortPolicy());
// 这是一个计数器操作,在线程池执行之前,给计数器指定数值(与要执行代码的次数一致)也就是students.size(),在线程池执行代码体里面要加上countDownLatch.countDown();代表每执行一次数值减少一,最后在循环体外边写上countDownLatch.await();代表等待计数器归零。
final CountDownLatch countDownLatch = new CountDownLatch(listData.size());
// 遍历集合
for (int i = 0; i < listData.size(); i++) {
    threadPoolExecutor.submit(() -> {
        try {
            System.out.println("执行业务数据" + listData.get(i));
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            // 计数器减一
            countDownLatch.countDown();
        }
    });
}
try {
    // 阻塞当前线程,等待线程池所有任务执行完
    countDownLatch.await();
} catch (Exception e) {
    System.out.println(e.getMessage());
} finally {
    // 关闭显线程池
    threadPoolExecutor.shutdown();
}

注意:上面的队列设置大一些,否则队列满了就会抛出异常

posted @ 2023-12-08 09:57  喵师傅  阅读(93)  评论(0编辑  收藏  举报