java for循环中创建线程池
用java写了一个爬虫,for循环下载链接,在循环里面用ThreadPoolExecutor创建的多线程下载,但for循环所在主线程不停向线程池中添加任务,这个通过Thr...
用java写了一个爬虫,for循环下载链接,在循环里面用ThreadPoolExecutor创建的多线程下载,但for循环所在主线程不停向线程池中添加任务,这个通过ThreadPoolExecutor设置线程数没用吗,有什么解决方案没有:在for循环中添加线程池多线程下载
展开
2个回答
展开全部
首先要明确线程池的意思,就是线程预先创建好放在一个池里面,使用后不会销毁
要区分任务和线程池,任务可以不断添加,但是线程池里线程的个数是固定的,当任务数超过线程数后,后面的任务需要等待有空闲的线程才会执行
所以不断添加任务没有关系,如果池中有50个线程,你添加100个任务同一时间也只会执行50个任务,剩下的50个任务需要等待前面的任务执行完毕后继续执行
所以你的主线程原则上可以不断for,但是你总得有个结束点吧
追问
会不会是每次for循环都重新new了一个线程池,这样的话就没有结束点了
展开全部
ThreadPoolExecutor的构造方法如下:
corePoolSize 核心线程池大小
maximumPoolSize 最大线程池大小
keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit keepAliveTime时间单位
workQueue 阻塞任务队列
threadFactory 新建线程工厂
RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
可以通过设置maximumPoolSize的大小,来控制最大长度,超过长度以后,可以通过RejectedExecutionHandler,进行处理,或者可以在主线程catch住RejectedExecution,然后将主线程sleep一段时间,重新执行任务,如果还是Reject,继续sleep
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,然后再加
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询