java for循环中创建线程池

用java写了一个爬虫,for循环下载链接,在循环里面用ThreadPoolExecutor创建的多线程下载,但for循环所在主线程不停向线程池中添加任务,这个通过Thr... 用java写了一个爬虫,for循环下载链接,在循环里面用ThreadPoolExecutor创建的多线程下载,但for循环所在主线程不停向线程池中添加任务,这个通过ThreadPoolExecutor设置线程数没用吗,有什么解决方案没有:在for循环中添加线程池多线程下载 展开
 我来答
飞花岁月2007
2017-12-26 · TA获得超过377个赞
知道小有建树答主
回答量:505
采纳率:78%
帮助的人:331万
展开全部
  1. 首先要明确线程池的意思,就是线程预先创建好放在一个池里面,使用后不会销毁

  2. 要区分任务和线程池,任务可以不断添加,但是线程池里线程的个数是固定的,当任务数超过线程数后,后面的任务需要等待有空闲的线程才会执行

  3. 所以不断添加任务没有关系,如果池中有50个线程,你添加100个任务同一时间也只会执行50个任务,剩下的50个任务需要等待前面的任务执行完毕后继续执行

  4. 所以你的主线程原则上可以不断for,但是你总得有个结束点吧

追问
会不会是每次for循环都重新new了一个线程池,这样的话就没有结束点了
加百列在微笑
2017-12-26 · TA获得超过634个赞
知道小有建树答主
回答量:518
采纳率:0%
帮助的人:138万
展开全部
ThreadPoolExecutor的构造方法如下:
corePoolSize 核心线程池大小
maximumPoolSize 最大线程池大小
keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit keepAliveTime时间单位
workQueue 阻塞任务队列
threadFactory 新建线程工厂
RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
可以通过设置maximumPoolSize的大小,来控制最大长度,超过长度以后,可以通过RejectedExecutionHandler,进行处理,或者可以在主线程catch住RejectedExecution,然后将主线程sleep一段时间,重新执行任务,如果还是Reject,继续sleep
追问
会不会是每次for循环都重新new了一个线程池,这样的话就没有结束点了
追答
你说的很对,总体上来说,线程池应该放在最外面,控制线程和task 其实还有一种思路是,就是把for做成另外一个现成,用来往线程池里追加task,失败了就sleep,然后再加
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式