记一次多线程报错问题

利用线程池创建多线程

public ThreadPoolExecutor getTableThreadPoolExecutor(int coreSize,int maxSize) {
        /*表格线程存活时间*/
        final int KEEP_ALIVE = 3;
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                coreSize,
                maxSize,
                KEEP_ALIVE,
                TimeUnit.HOURS,
                new LinkedBlockingDeque<Runnable>(20),
                new JobThreadFactory("表格统计"),
                new ThreadPoolExecutor.AbortPolicy());
        return executor;
    }

启动项目之后出现了

2023-04-04 16:41:56 [统计] INFO  d.s.d.thread.JobHandleThread - 任务:DATA-报错
2023-04-04 16:41:56 [表格统计--1] ERROR d.s.d.thread.JobHandleThread - Taskhandler.tableHandler.DATA$2@4c3917a0 rejected from java.util.concurrent.ThreadPoolExecutor@1e81bebe[Running, pool size = 2, active threads = 2, queued tasks = 20, completed tasks = 0]
 

启动时会出现这个提示之后,程序执行到中断 

2023-04-04 16:42:31 [xxl-job, executor ExecutorRegistryThread] INFO  c.x.j.c.t.ExecutorRegistryThread - >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='statistics', registryValue='192.168.0.1:9996'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://192.168.0.1:8180/xxl-job-admin/api/registry, content=null]

然后就不执行了,,郁闷了2天,各种捕捉异常,多次执行,程序始终不能正常结束。不管用,又重新看了下线程池创建的工作原理

复习一遍

1、 当线程池小于corePoolSize时,新任务将创建一个新的线程,即使此时线程池中存在空闲线程。

2、 当线程池达到corePoolSize时,新提交的任务将被放入workQueue中,等待线程池任务调度执行。

3、 当workQueue已满,且maximumPoolSize>corePoolSize时,新任务会创建新线程执行任务。

4、 当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理。

5、 当线程池中超过corePoolSize时,空闲时间达到keepAliveTime时,关闭空闲线程。

另外,当设置了allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭。

默认提供了四种拒绝策略

1、AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作;

2、CallerRunsPolicy策略:如果线程池的线程数量达到上限,该策略会把任务队列中的任务放在调用者线程当中运行;

3、DiscardOledestPolicy策略:该策略会丢弃任务队列中最老的一个任务,也就是当前任务队列中最先被添加进去的,马上要被执行的那个任务,并尝试再次提交。

4、DiscardPolicy策略:该策略会默默丢弃无法处理的任务,不予任何处理。当然使用此策略,业务场景中需允许任务的丢失;

嗯,AbortPolicy策略会阻止系统正常执行完成,很明显了,核心线程数、最大线程数、阻塞队列3个参数设置小了,我的数据量是80,开2个或者5个线程的话,队列会塞70个进去,只设20个队列会异常,问题就出在阻塞队列小了,然后将

new LinkedBlockingDeque<Runnable>(100) 设置成100,程序可以顺利执行完成
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值