记一次线程池定义出错导致execute被阻止的解决思路

使用OSS进行分片上传时,为了节省上传时间,将分好的每一片文件都单独使用一个线程进行上传。

起初定义线程池,newFixedThreadPool设置为10个

记一次线程池定义出错导致execute被阻止的解决思路

然后将分好的片循环丢进线程池里执行: 

记一次线程池定义出错导致execute被阻止的解决思路

随后shutdown掉线程池,执行以前提交的任务,但不接受新任务。

记一次线程池定义出错导致execute被阻止的解决思路

 看似没毛病,结果意外发现连续上传第二次的时候执行到execute竟然报java.util.concurrent.RejectedExecutionException的异常,说明线程池被拒绝了。那么问题就来了,线程池在工作完后明明shutdown了呢,难道shutdown的延迟关闭问题?

打开debug一看,runworder显示0,上次执行最大线程数为2,isTerminated、isShutdown均为true,各项参数表明线程池的确关闭了。

等等,调查到这里发现不对,为何第二次调用上传方法,线城池为何仍是关闭状态?为何线程池只使用了一次?这个时候答案就已经很明确的指向了一个地方,那就是初始化线程池的地方------->>>>

记一次线程池定义出错导致execute被阻止的解决思路

executorService竟然定义成了全局,那么意思就是随着项目运行的时候就初始化完成,等第一次shutdown完后这个线程池相当于永远关闭了,所以会导致第二次被线程池拒绝.....

一个很低级的错误,在此警告下自己....

代码千万行,安全第一行!!!

编码不仔细,调试两行泪!!!