线程池的目的是为了使用有限的线程处理大并发的任务。jdk自带丰富的线程池适应不同的应用场景。一般线程池需要考虑这样四个问题:
问题一:Core and maximum pool sizes:
线程池的大小,线程池的目的就是使用为了节省资源,使用有限的线程处理大并发的任务。你要为的线程设置最大的线程数maximumPoolSize,表示该线程数最大创建这么多线程,当要处理的任务多于线程数的时候,就放到队列里去等待,当有线程完成运行任务的时候,再从队列里取出来执行。
maximumPoolSize是最大的线程数,是最坏的打算,如果你认为n个线程就可以处理得了你的任务,你可以设置corePoolSize。表示线程池只创建corePoolSize个线程在处理任务,当任务已经把缓存队列占满,corePoolSize个线程处理不过来的时候,才会去创建新的线程。
问题二:keep-live
如果任务少,线程长时间闲置,就会浪费资源,但是一旦关闭了这个线程,等任务来了再创建线程又浪费时间。你可以根据你的任务的并发数,为线程池设置keep-live时间,当多长时间没有任务处理的线程自动关闭。这样当任务数少的时候,池子里的线程数就会相应减少,当任务多的时候,线程数也会随之增加。
问题三:queue
线程池一般都要指定一个缓存队列,因为你不能保证线程池里的线程足够处理你的任务,当并发任务数超过这个线程的核心线程数的时候,就会把任务暂且存放在这个缓存队列里。
问题四:Reject Policy
当线程池里的maximumPoolSize的线程都在处理任务,queue里的任务也占满了。也就是系统达到了满负荷,再有新任务进来,这时候应该怎么处理,这需要一个Policy 处理策略,对这个新任务应该怎么处理 需要指定一个策略RejectedExecutionHandler
java.util.concurrent.ThreadPoolExecutor.AbortPolicy 任务填不进去,直接报错
java.util.concurrent.ThreadPoolExecutor.DiscardPolicy 直接丢弃
java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy 丢一个队列中最老的任务,把新任务加进去
如果你没有其他方面的要求,一个线程池基本只要考虑上面四个方面。
具体线程池的创建和使用可以简单参考:
http://zhaoyanblog.com/archives/203.html
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/274.html