java for循环中创建线程池

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java for循环中创建线程池相关的知识,希望对你有一定的参考价值。

用java写了一个爬虫,for循环下载链接,在循环里面用ThreadPoolExecutor创建的多线程下载,但for循环所在主线程不停向线程池中添加任务,这个通过ThreadPoolExecutor设置线程数没用吗,有什么解决方案没有:在for循环中添加线程池多线程下载

    首先要明确线程池的意思,就是线程预先创建好放在一个池里面,使用后不会销毁

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

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

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

追问

会不会是每次for循环都重新new了一个线程池,这样的话就没有结束点了

参考技术A 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,然后再加

本回答被提问者采纳

java创建线程池都有哪些

ava通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,
LIFO,
优先级)执行。
参考技术A 一、继承thread类创建线程子类
1.在这子类中重写run方法,在run方法内写线程任务代码
2.创建该子类实例,即是创建了一个线程实例
3.调用该实例的start方法来启动该线程
二、建一个类去实现runnable接口
1.该类去实现接口的run方法,run方法内写线程任务代码
2.创建该类实例,把该实例当作一个标记target传给thread类,如:thread
t
=
new
thread(该类实例);即创建一个线程对象
3.调用线程的star方法来启用该线程

以上是关于java for循环中创建线程池的主要内容,如果未能解决你的问题,请参考以下文章

for循环内线程池并发执行任务,等到子线程全部处理完任务,主线程在执行java的实现方式

强烈求助!!JS 动态循环创建DIV

java创建线程池都有哪些

Android中的线程池

线程池 C++

如何创建一个Java线程池?