线程创建方法是否等待线程获得空闲? 我可以减少使用线程池生成的线程数吗?当线程池中没有线程空闲并且我们向池中提交任务时会发生什么?
回答
如果您使用缓存线程池,该池将创建更多线程。但是,这只会是任何时候所需的最大值,并且可能远远低于您提交的任务数量。
如果使用固定大小的线程池,它将创建固定数量的线程,无论您是否给它任何任务,或者如果您给它多任务比它可以做。它会排队正在等待的任何任务。
线程创建方法是否等待线程获得空闲?
虽然您可以创建一个队列来完成此操作,但这不是默认行为。如果需要,更常见的解决方案是让调用者执行任务。
我可以减少使用线程池生成的线程数吗?
如果限制线程数,线程池可能会产生比任务更少的线程。
线程创建方法是否等待线程获得空闲?
与您的标题相矛盾。你通常会提交一个任务,当有一个任务可用时,池会将该任务传递给工作线程。所以你不会创建一个线程,但提交一个任务。无论您是等待任务执行还是触发异步执行(大多数情况下都是默认执行)取决于您的系统和要求。
我可以减少使用线程池生成的线程数吗?
线程池通常被用来减少创建的线程数,即而不是每个任务一个线程,你有工作线程的定义(最大)的数量,因此如果#tasks > max threads in pool
你降低线程数需要。
从ThreadPoolExecutor的文档:
甲的ThreadPoolExecutor将自动调整池大小(参见 getPoolSize())根据由corePoolSize设定的界限(参见 getCorePoolSize())和maximumPoolSize(参见getMaximumPoolSize( ))。 当在方法execute(java.lang.Runnable)中提交新任务时, 且少于corePoolSize线程正在运行时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求,即 。 如果有多于corePoolSize但小于maximumPoolSize 的线程正在运行,则仅当队列为 已满时才会创建新线程。通过设置corePoolSize和maximumPoolSize相同,您可以创建一个固定大小的线程池 。通过将maximumPoolSize设置为实质上为 的无限值(例如Integer.MAX_VALUE),您允许池允许任意数量的并发任务容纳 。最通常, 核心和最大池大小仅在构建时设置,但它们也可以使用setCorePoolSize(int)和 setMaximumPoolSize(int)动态更改。
基本上,您可以设置两种尺寸:“核心”尺寸和“最大”尺寸。提交任务时,如果少于'核心'线程,将创建一个新线程来执行该任务。如果有大于'core'的线程,则当前线程中的一个将用于执行任务,除非当前所有线程都处于忙碌状态。如果当前所有线程都处于忙碌状态,则会创建更多的线程,达到“最大”大小。一旦达到“最大”线程数量,就不会再创建任何更多的任务,并且新的任务将排队等待一个线程可用来运行它们。
在一般情况下,线程池没有“正确”的方式工作。任何给定的实现都可以使用:固定大小的线程池,它总是有X个线程,或者线程池总是增长到最大限制,等等。
- 1. 线程池不跑提交的任务
- 2. 如果我将工作发布到线程池并且线程已在boost工作,会发生什么情况?
- 3. 在C#.Net中使用委托,当我用完.Net线程池中的线程时会发生什么?
- 4. 线程问题 - 如果线程池中没有线程可用,会发生什么?
- 5. windows线程池和CLR线程池有什么区别
- 6. 任务vs线程池
- 7. 面向任务的线程池
- 8. await在线程池终结并不会终止线程池
- 9. 线程池中的线程
- 10. 在线程池中组织任务
- 11. 当您使用Task.Run时,会发生什么情况以致线程池耗尽?
- 12. 在哪个线程池affinityRun提交任务?如何配置线程数量?
- 13. Java线程池/执行程序服务和wait()s - 线程和任务队列发生了什么?
- 14. 将任务提交给线程池给出RejectedExecutionException
- 15. 任务ID作为线程池中的线程名称
- 16. 当我们将线程的引用更改为空时会发生什么?
- 17. openMP和线程池有什么区别?
- 18. 线程与NSAutorelease池有什么关系?
- 19. 为什么我的线程池的线程不会在同一时间完成
- 20. 线程池,它提供线程
- 21. 限制线程池中并发线程的数量
- 22. 在多线程/线程池中访问asp.net会话线程
- 23. 与线程池链责任
- 24. 当我们在Autorelease池中编写[Obj autorelease]时会发生什么?
- 25. 线程池到任务转换
- 26. 线程池处理'重复'任务
- 27. 线程池与许多阻塞任务
- 28. 线程池不接受新的任务
- 29. 相关任务的线程池
- 30. 任务比较大的线程池
这不是发生了什么;在内部,一个线程池维护一个'Callable'队列,并为一个线程分配一个'Callable',当一个线程“可以使用”时。 – fge
你是否在谈论['ThreadPoolExecutor'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)或更一般的东西? – erickson